5

我知道已经有一个标准方法,前缀为L

wchar_t *test_literal = L"Test";

问题是wchar_t不能保证是 16 位的,但是对于我的项目,我需要一个 16 位的wchar_t. 我也想避免通过的要求-fshort-wchar

那么,是否有任何 C(不是 C++)前缀可以让我声明一个 UTF-16 字符串文字?

4

2 回答 2

7

那么,是否有任何 C(不是 C++)前缀可以让我声明一个 UTF-16 字符串文字?

差不多,但不完全。C2011 为您提供以下选项:

  • 字符串文字(类型的元素char) - 没有前缀。例子:"Test"
  • UTF-8 字符串文字(类型的元素char) - 'u8' 前缀。例子:u8"Test"
  • 三种风格的宽字符串文字:
    • wchar_t元素 - 'L' 前缀。例子:L"Test"
    • char16_t元素 - 'u' 前缀。例子:u"Test"
    • char32_t元素 - 'U' 前缀。例子:U"Test"

但是请注意,尽管您可以声明具有 type 元素的宽字符串文字char16_t,但标准不保证将使用 UTF-16 编码,也不对语言基本之外的字符做出任何特殊要求字符集必须包含在执行字符集中。但是,您可以在编译时测试前者:如果char16_t在给定的符合实现中表示 UTF-16 编码的字符,则该实现会将宏定义__STDC_UTF_16__1.

另请注意,您需要包含 (C's)uchar.h标头才能使用char16_t类型名称,但u"..."文字的语法不依赖于此。请注意,因为此标头名称与 International Components for Unicode 的 C 接口使用的名称相冲突,这是一个相对广泛使用的 Unicode 支持包。

最后,请注意,其中大部分是 C2011 中的新内容。要使用它,您需要一个符合 C2011 的实现。这些当然是可用的,但是许多仅符合早期标准甚至不符合标准的实现也是如此。标准 C99 和更早版本不提供保证 16 位元素的字符串文字语法。

于 2018-06-02T14:39:36.463 回答
-2

您需要一个 16 位的 wchar_t - 但它不在您的控制范围内。如果编译器说它是 32 位,那么它就是 32 位,无论您想要什么或需要什么都没关系。

字符串类是模板化的。您始终可以使用模板来创建具有 16 位字符的模板类。我个人会尝试删除任何不是 UTF-8 的 Unicode 处理。

另一种方法是巧妙的#ifdef,如果 wchar_t 不是 16 位,它将产生编译时错误,并在您实际需要解决问题时解决问题。

于 2018-06-02T14:42:14.477 回答