你如何在C中安全地声明一个16位的字符串文字?

时间:2018-06-02 14:23:58

标签: c unicode string-literals widechar unicode-literals

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

wchar_t *test_literal = L"Test";

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

的要求

那么,是否有允许我声明UTF-16字符串文字的C(不是C ++)的前缀?

2 个答案:

答案 0 :(得分:4)

  

那么,是否有允许我声明UTF-16字符串文字的C(不是C ++)的前缀?

几乎,但不完全。 C2011为您提供以下选择:

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

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

另请注意,您需要包含(C&#39; s)uchar.h标头以使用char16_t类型名称,但文字的u"..."语法不依赖于此。请注意,因为此标题名称与国际组件Unicode的C接口所使用的名称冲突,这是一个相对广泛使用的Unicode支持包。

最后,请注意,C2011中有很多新功能。要使用它,您需要符合C2011的实现。这些肯定是可用的,但是许多实现只符合早期标准,甚至没有。标准C99及更早版本不提供保证16位元素的字符串文字语法。

答案 1 :(得分:-1)

你需要一个16位的wchar_t - 但它不受你的控制。如果编译器说它是32位,那么它是32位,并不重要你想要什么或需要什么。

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

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