在一个相关的问题之后,我想问一下C++ 11中的新字符和字符串文字类型.看来我们现在有四种字符和五种字符串文字.角色类型:
char a = '\x30'; // character, no semantics
wchar_t b = L'\xFFEF'; // wide character, no semantics
char16_t c = u'\u00F6'; // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4
Run Code Online (Sandbox Code Playgroud)
和字符串文字:
char A[] = "Hello\x0A"; // byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto E[] = u8"\u00F6\U0010FFFF"; // (3)
Run Code Online (Sandbox Code Playgroud)
问题是:\x/ \u/ \U …
来自维基百科:
为了在C++编译器中增强对Unicode的支持,char类型的定义已被修改为至少为存储UTF-8的8位编码所需的大小.
我想知道这对于编写便携式应用程序究竟意味着什么.写这个有什么区别吗?
const char[] str = "Test String";
Run Code Online (Sandbox Code Playgroud)
或这个?
const char[] str = u8"Test String";
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不在代码中的每个字符串文字中使用后者?
当TestString中有非ASCII字符时会发生什么?
C++ 11引入了一组新的字符串文字前缀(甚至允许用户定义的后缀).除此之外,您可以直接使用Unicode转义序列来编码某个符号,而无需担心编码.
const char16_t* s16 = u"\u00DA";
const char32_t* s32 = U"\u00DA";
Run Code Online (Sandbox Code Playgroud)
但是我可以在wchar_t字符串文字中使用unicode转义序列吗?如果不可能,这似乎是一个缺陷.
const wchar_t* sw = L"\u00DA";
Run Code Online (Sandbox Code Playgroud)
will的整数值sw[0]当然取决于wchar_t特定平台上的内容,但对于所有其他效果,这应该是可移植的,不是吗?
要了解C++是否是我的项目的正确语言,我想测试UTF-8功能.根据参考资料,我建立了这个例子:
#include <string>
#include <iostream>
using namespace std;
int main() {
wstring str;
while(getline(wcin, str)) {
wcout << str << endl;
if(str.empty()) break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入一个UTF-8字符时,它行为不端:
$ > ./utf8
Hello
Hello
für
f
$ >
Run Code Online (Sandbox Code Playgroud)
它不仅不会打印ü,而且会立即退出.gdb告诉我没有崩溃,但正常退出,但我发现很难相信.
C++ 和 UTF8 的延续- 为什么不直接替换 ASCII?
为什么没有std::ustring可能更换两个std::string,std::wstring在新的应用?
当然在标准库中有相应的支持。类似于 howboost::filesystem3::path不关心字符串表示并同时使用std::string和std::wstring。
我需要一个C++代码来将给定的字符串转换wchar_t*为UTF-16字符串.它必须适用于Windows和Linux.我在搜索过程中浏览了很多网页,但这个主题对我来说仍然不清楚.
据我所知,我需要:
setlocale使用LC_TYPE和UTF-16编码进行呼叫.wcstombs转换wchar_t为UTF-16字符串.setlocale以恢复以前的区域设置.你知道我可以wchar_t*以便携方式(Windows和Linux)转换为UTF-16的方式吗?
我正在尝试将UTF-16编码的字符串转换为UCS-4
如果我理解正确,C++ 11通过codecvt_utf16提供此转换.
我的代码是这样的:
#include <iostream>
#include <locale>
#include <memory>
#include <codecvt>
#include <string>
using namespace std;
int main()
{
u16string s;
s.push_back('h');
s.push_back('e');
s.push_back('l');
s.push_back('l');
s.push_back('o');
wstring_convert<codecvt_utf16<wchar_t>, wchar_t> conv;
wstring ws = conv.from_bytes(reinterpret_cast<const char*> (s.c_str()));
wcout << ws << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:显式的push_backs来解决我的clang版本(Xcode 4.2)没有unicode字符串文字这一事实.
代码运行时,我得到终止异常.我在这里做违法的事吗?我认为它应该工作,因为我传递给wstring_convert的const char*是UTF-16编码的,对吧?我也认为字节顺序是问题,但我已经检查过情况并非如此.
我很高兴标准库能够获得一个to_string功能,但现在我处于WTF模式.首先,为什么不是这个模板,其次如果它不是返回值的模板那么为什么在世界上他们没有to_u16string()和to_u32string()功能.
我知道有提升词法演员,但我很想知道是否有一种标准的方法来获得我想要的东西而无需手动编写这些功能?
编辑:使事情更糟糕的提升1.46也不喜欢u16string :(
boost::lexical_cast<u16string>(22.44);
Run Code Online (Sandbox Code Playgroud)
在抛出'boost :: exception_detail :: clone_impl的实例后终止调用
'what():错误的词法转换:源类型值无法解释为目标
使用C++ 11,我如何从UTF-8编码std::string中获取文本中每个字符的Unicode值uint32_t?
就像是:
void f(const std::string &utf8_str)
{
for(???) {
uint32_t code = ???;
/* Do my stuff with the code... */
}
}
Run Code Online (Sandbox Code Playgroud)
假设主机系统区域设置是UTF-8有帮助吗?C++ 11为此任务提供了哪些标准库工具?