我在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.
确切的翻译是这样的:
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更改为一点点,因为代理被视为两个字符。我们简单地计算有多少字符不是更高的代理,以获得实际字符的清晰计数。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1045 次  |  
        
|   最近记录:  |