【问题标题】:UTF-8 escape sequence in C string literalC 字符串文字中的 UTF-8 转义序列
【发布时间】:2014-01-15 20:36:53
【问题描述】:

在 C 中,我使用以下形式指定 Unicode 字符:

"\uCODEPOINT"

但是,我找不到有关如何存储它的任何详细信息。是 UTF-8、16、32 吗?是否有指定 UTF-8 编码的符号,还是我必须以十六进制写入每个字节?

【问题讨论】:

  • 可能是 UTF-8 可变宽度,但我也想知道。我能在stackoverflow.com/questions/6796157/…找到与C++有关的唯一信息。
  • 有据可查的是 \u 后跟 4 个十六进制数字。
  • 我认为您需要查看 Unicode 概念。从unicode.org开始你会发现“Is there a notation for UTF-8 characters”是不连贯的——UTF-8是unicode码位的编码。

标签: c unicode utf-8 escaping


【解决方案1】:

\uXXXX 是一个(短格式)通用字符名称。例如,您可以在程序中的任何位置使用\u0041 来代替A——这可以在源文本中,例如,作为标识符的一部分,也可以在字符或字符串文字中。如果您在文字中使用它,它将与您在该文字中使用 A 完全相同。这同样适用于编码长度超过 8 位的字符的名称……您可以使用通用名称,或者如果您有允许的输入法,您可以直接输入字符。字符在内存中的编码方式取决于实现,取决于字符是否出现在 "" 或 L"" 文字中,并取决于字符是否是执行字符集的成员。请注意 C 标准中的这一点:

每个源字符集成员和字符常量中的转义序列和 字符串文字被转换为执行字符的对应成员 放;如果没有对应的成员,则将其转换为实现- 除空(宽)字符之外的已定义成员。)

在使用 UTF-8 编码表示非宽字符串的实现中,出现在非宽字符串文字中的 \uXXXX 当然会与文字中的所有其他字符一起以 UTF-8 编码.如果 \uXXXX 出现在宽字符串文字中,它将被编码为值为 0xXXXX 的宽字符。

【讨论】:

  • 我相信我可以在文字前面加上“u8”来指定 C11 中的 UTF-8 编码,但是在早期的标准中我该怎么做呢?
  • 要在早期版本的 C 中可移植地创建 UTF-8 文字,您必须手动输入十六进制值,正如您在(编辑的)问题中提到的那样。但是,某些实现,例如某些版本的 gcc 和 Visual Studio,支持“窄”字符串的 UTF-8 编码。检查你的实现文档……你当然可以打印出字符串的字节,或者只是查看生成的汇编代码以了解字符是如何编码的。
【解决方案2】:

但是,我找不到有关如何存储它的任何详细信息。

执行字符集取决于实现。但是,如果默认值不是您想要的,一些编译器确实有某种options 来更改它。 C11 标准有其他方法可以在 UTF 编码中指定 Unicode 字符串文字(例如 u8"Hello")。

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 2017-03-04
    • 2015-11-06
    • 2019-11-12
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2014-02-05
    • 2012-09-22
    相关资源
    最近更新 更多