我有4个密切相关的问题:
C ++ 14是否具有内置机制,用于在UTF-8和系统本机多字节编码之间进行转换,即std::codecvt<wchar_t, char>
采用的多字节编码专业化(http://en.cppreference.com/w/cpp/locale/codecvt)?
C ++ 14是否具有内置机制,用于在UTF-8和系统本机宽字符编码之间进行转换,即{{1}假设的宽字符编码专业化(http://en.cppreference.com/w/cpp/locale/codecvt)?
与问题1相同,但是对于UTF-16而不是UTF-8。
与问题2相同,但是对于UTF-16而不是UTF-8。
std::codecvt<wchar_t, char>
)之间以及本机多字节和本机宽字符编码(std::codecvt<char16_t, char, std::mbstate_t>
)之间进行转换的方法。
答案 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,但鉴于它们必须等于它们的基本字符集,这是不现实的。