【问题标题】:Printing characters from string give different results从字符串打印字符会产生不同的结果
【发布时间】:2014-08-23 18:48:21
【问题描述】:

我对 D 中的 UTF8 字符串感到困惑。有人可以解释为什么下面的代码会给出不同的结果吗?为什么"abç"[2] == 'ç'false 而不是true

string s = "abç";
for(int i = 0; i < s.length; i++)
{
    dchar c = s[i];
    writefln("%#x", cast(int)c);
}
writeln();
foreach(dchar c; s)
{
    writefln("%#x", cast(int)c);
}

这段代码输出:

【问题讨论】:

    标签: string utf-8 d


    【解决方案1】:

    ç 字符的 UNICODE 代码点大于 7F(即 E7),因此在 UTF8 字符串中表示为多个 char(即 C3 A7 对)

    s[2] 只是s 中的第三个char(也是“ç”的第一个字符)

    您的第一个循环按原样打印“字节”。 (取为 s[i]) 您的第二个循环将 s 中的代码点转换为 UTF32。

    e7 和 C3 A7 只是同一个 (U+00E7) 字符的 UTF32 和 UTF8 编码。

    供参考:http://www.fileformat.info/info/unicode/char/e7/index.htm

    【讨论】:

    • 所以如果我想从给字符串s 中获取带有unicode 字符的第二个字符,s[1] 将不起作用?我应该处理代码点吗?
    • 是的:UTF8 中的代码点长度并不完全相同,因此直接索引是没有用的(除非您可以事先证明所有字符串都是 ASCII)。
    • 我知道它们的长度不尽相同,但没有意识到它在 D 中不起作用。按索引获取字符的 D 方法是什么?
    • 在 UTF8 中没有任何意义。不管用什么语言。如果您想通过直接索引字符来工作,则必须使用 UTF32 字符串。至少在 UNICODE 代码点将保持小于 2^^32 之前
    • @jack 您可以使用 std.utf.toUTF32(); 转换为 dstring(您可以在其中正确索引);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多