gpt4 book ai didi

c# - C# 中的 CodePointAt 等价物

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:39 25 4
gpt4 key购买 nike

我在 JAVA 中有这段代码并且工作正常

    String a = "ABC";
System.out.println(a.length());
for (int n = 0; n < a.length(); n++)
System.out.println(a.codePointAt(n));

预期的输出是3个656667我对 a.length() 有点困惑,因为它应该以字符形式返回长度,但字符串必须以 16 位或任何 unicode 字符需要的形式存储每个 < 256 个字符。

但问题是我如何在 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 :)。只需要交付一个Win APP,它是一个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# 中,您根本不需要 codePointAt,您可以通过将字符转换为 int 来直接获取 unicode 编号(或者对于赋值,它被转换为含蓄地)。所以你可以简单地通过做得到你的cp

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 的变化,因为代理被计为两个字符。我们简单地计算有多少字符不是更高的代理项以获得实际字符的明确计数。

关于c# - C# 中的 CodePointAt 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23751261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com