C ++ 14:UTF-8 / UTF-16与本机字符编码之间的转换

时间:2017-02-27 02:47:44

标签: c++ utf-8 character-encoding

我有4个密切相关的问题:

  1. C ++ 14是否具有内置机制,用于在UTF-8和系统本机多字节编码之间进行转换,即std::codecvt<wchar_t, char>采用的多字节编码专业化(http://en.cppreference.com/w/cpp/locale/codecvt)?

  2. C ++ 14是否具有内置机制,用于在UTF-8和系统本机宽字符编码之间进行转换,即{{1}假设的宽字符编码专业化(http://en.cppreference.com/w/cpp/locale/codecvt)?

  3. 与问题1相同,但是对于UTF-16而不是UTF-8。

  4. 与问题2相同,但是对于UTF-16而不是UTF-8。

  5. 编辑:我意识到&#34;是&#34;对任何这些问题,有效地意味着&#34;是&#34;因为C ++ 14显然提供了在UTF-8和UTF-16(std::codecvt<wchar_t, char>)之间以及本机多字节和本机宽字符编码(std::codecvt<char16_t, char, std::mbstate_t>)之间进行转换的方法。

1 个答案:

答案 0 :(得分:1)

  

系统本机多字节编码,即In [740]: m,n = len(values), len(searchvals) In [741]: values.shape Out[741]: (11,) In [742]: values.strides Out[742]: (4,) In [743]: In [743]: M = as_strided(values, shape=(n,m-n+1),strides=(4,4)) In [744]: M Out[744]: array([[0, 1, 2, 1, 2, 4, 5, 6, 1], [1, 2, 1, 2, 4, 5, 6, 1, 2], [2, 1, 2, 4, 5, 6, 1, 2, 1]]) In [745]: M == np.array(searchvals)[:,None] Out[745]: array([[False, True, False, True, False, False, False, False, True], [False, True, False, True, False, False, False, False, True], [False, True, False, False, False, False, True, False, True]], dtype=bool) In [746]: np.where(np.all(_,axis=0)) Out[746]: (array([1, 8], dtype=int32),) 专门化所假设的多字节编码

存在混淆,可能是由于对cppreference的误导性措辞(我的错,现在已经修复以符合标准和现实);在现有实现(libc ++和libstdc ++)中,与语言环境无关的codecvt特化std::codecvt<wchar_t, char>不处理任何多字节编码。标准的措辞是“缩小和宽字符的原生字符集”,而现有的实现只是意味着1:1的转换,就像btowc / wctob在C中所做的那样:

codecvt<wchar_t, char>

实际上,这是libc++ implementation

在每个有用的上下文中,多字节编码是由语言环境提供的codecvt facet指定的编码,或者是自定义codecvt facet或UTF-8(由template<class F> struct facet : F { using F::F; ~facet() {} }; facet<std::codecvt<wchar_t, char, std::mbstate_t>> fp; std::cout << fp.max_length() << '\n'; // prints 1 in libc++ and libstdc++ facet提供)。含义,

  

在UTF-8和系统本机多字节编码之间

表示“在UTF-8和由语言环境指定的多字节编码之间”

std::codecvt_utf8*
  

C ++ 14是否具有内置机制,可在UTF-8和系统本机宽字符编码之间进行转换

Native Wide被有效地定义为Unicode或(在Windows上)其任意子集,这就是从std::codecvt_utf8得到的。恶意实现可能有一个wchar_t保持值在数字上与Unicode代码点不同,只要它们映射1:1,但鉴于它们必须等于它们的基本字符集,这是不现实的。