CodePointAt相当于c#

mde*_*dev 5 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));
Run Code Online (Sandbox Code Playgroud)

正如预期的那样输出是3 65 66 67我有点困惑a.length()因为它被用来返回chars中的长度但是String必须存储16位中的每个<256 char或unicode字符需要的任何内容.

但问题是我怎样才能做同样的C#?我需要扫描一个字符串并根据发现的一些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.
Run Code Online (Sandbox Code Playgroud)

提前致谢.

我有多喜欢JAVA :).只需要提供一个Java/Linux应用服务器的Win APP.

Pie*_*ult 6

确切的翻译是这样的:

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
Run Code Online (Sandbox Code Playgroud)

在 C# 中,您根本不需要codePointAt,您可以通过将字符转换为 an 来直接获取 unicode 编号int(或者对于赋值,它是隐式转换的)。所以你可以简单地通过这样做来获得你的cp

cp = (int)str[n];
Run Code Online (Sandbox Code Playgroud)

我是多么喜欢 C# :)

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

int cp = Char.ConvertToUtf32(a, n);
Run Code Online (Sandbox Code Playgroud)

在将循环增加 2 之后(因为它是用两个字符编码的),Char.IsSurrogatePair()条件是。

您的翻译将变成

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));
Run Code Online (Sandbox Code Playgroud)

请注意s.Length()计数从LINQ更改为一点点,因为代理被视为两个字符。我们简单地计算有多少字符不是更高的代理,以获得实际字符的清晰计数。