我在JAVA中使用此代码并且工作正常
String a = "ABC";
System.out.println(a.length());
for (int n = 0; n < a.length(); n++)
System.out.println(a.codePointAt(n));
预期的输出是 3 65 66 67 我有点困惑a.length(),因为它被用来返回chars中的长度但是String必须存储每个&lt; 256个16位字符或任何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.
提前致谢。
我有多喜欢JAVA :)。只需要提供一个Java / Linux应用服务器的Win APP即可。
答案 0 :(得分:4)
确切的翻译是这样的:
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#中你根本不需要codePointAt
,你可以通过将角色投射到int
直接获得unicode号码(或者用于分配,它可以被投射)隐含的)。所以你只需要做
cp = (int)str[n];
我多么喜欢C#:)
但是,这仅适用于低Unicode值。当你打破字符串时,代理对被处理为两个不同的字符,因此它们不会被打印为一个值。如果确实需要处理UTF32,您可以参考this answer,它基本上使用
int cp = Char.ConvertToUtf32(a, n);
将循环递增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));
请注意从s.Length()
到LINQ的一点点变化,因为代理被计为两个字符。我们只计算有多少字符不是更高的代理人才能得到明确的实际字符数。
答案 1 :(得分:0)
以下代码获取字符串
的一部分的代码点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);
}