C# c中等价的代码点#

C# c中等价的代码点#,c#,java,unicode,C#,Java,Unicode,我用JAVA编写了这段代码,效果很好 String a = "ABC"; System.out.println(a.length()); for (int n = 0; n < a.length(); n++) System.out.println(a.codePointAt(n)); String a=“ABC”; System.out.println(a.length()); 对于(int n=0;n

我用JAVA编写了这段代码,效果很好

    String a = "ABC";
    System.out.println(a.length());
    for (int n = 0; n < a.length(); n++)
        System.out.println(a.codePointAt(n));
String a=“ABC”;
System.out.println(a.length());
对于(int n=0;n
输出与预期一致 3. 65 66 67 我对d.length()有点困惑,因为它可以以字符的形式返回长度,但字符串必须以16位或unicode字符所需的任何形式存储每个<256个字符

但问题是我怎样才能做同样的事情?。 我需要扫描字符串并根据找到的一些unicode字符进行操作

我需要翻译的真正代码是

    String str = this.getString();
    int cp;
    boolean escaping = false;
    for (int n = 0; n < len; n++)
    {
        //===================================================
        cp = str.codePointAt(n); //LOOKING FOR SOME EQUIVALENT IN C#
        //===================================================
        if (!escaping)
        {
          ....

       //Closing all braces below.
String str=this.getString();
int-cp;
布尔转义=假;
对于(int n=0;n
提前谢谢


我多么喜欢JAVA:)。只需要提供一个Win应用程序,它是JAVA/Linux应用程序服务器的客户端。

确切的翻译是:

string a = "ABC⤶"; //Let's throw in a rare unicode char
Console.WriteLine(a.Length);
for (int n = 0; n < a.Length; n++)
    Console.WriteLine((int)a[n]); //a[n] returns a char, which we can cast in an integer
//final result : 4 65 66 68 10550
我有多爱C:)

但是,这仅对较低的Unicode值有效。分解字符串时,代理项对作为两个不同的字符处理,因此它们不会作为一个值打印。如果确实需要处理UTF32,可以参考,它基本上使用

int cp = Char.ConvertToUtf32(a, n);
将循环增加2(因为它在两个字符上编码)后,使用条件

你的翻译就会变成

string a = "ABC\U0001F01C";
Console.WriteLine(s.Count(x => !char.IsHighSurrogate(x)));
for (var i = 0; i < a.Length; i += char.IsSurrogatePair(a, i) ? 2 : 1)
    Console.WriteLine(char.ConvertToUtf32(a, i));
string a=“ABC\U0001F01C”;
Console.WriteLine(s.Count(x=>!char.ishighsrogate(x));
对于(变量i=0;i

请注意计数从
s.Length()
到一点LINQ的变化,因为代理项被计为两个字符。我们只需计算不高于代理项的字符数,即可获得实际字符的清晰计数。

以下代码获取字符串一部分的代码点

var s = "\uD834\uDD61";
for (var i = 0; i < s.Length; i += char.IsSurrogatePair(s, i) ? 2 : 1)
{
    var codepoint = char.ConvertToUtf32(s, i);
    Console.WriteLine("U+{0:X4}", codepoint);
}
var s=“\uD834\uDD61”;
对于(变量i=0;i
@SotiriosDelimanolis,因为如果您不这样做,您直接打印的是字符,而不是unicode数字?因此,出于打印目的。如果基础值是一个
char
,这与返回代理项(
int
)的Java如何等效值大于一个
字符所能容纳的值?@SotiriosDelimanolis Yeah刚刚验证了这一点,确实可以在没有强制转换的情况下进行赋值,并且ReSharper会将其标记为冗余语句。谢谢你的回答。我开始更喜欢C了。毫无疑问,如果你打算在Windows上运行,这是最好的。你能解决我的问题吗之前的评论?我仍然不相信这等同于
codePointAt
var s = "\uD834\uDD61";
for (var i = 0; i < s.Length; i += char.IsSurrogatePair(s, i) ? 2 : 1)
{
    var codepoint = char.ConvertToUtf32(s, i);
    Console.WriteLine("U+{0:X4}", codepoint);
}