为什么 codecvt 不能将 BMP 之外的 unicode 转换为 u16string?
Why codecvt can't convert unicode outside BMP to u16string?
我正在尝试理解 C++ unicode,但现在这让我感到困惑。
代码:
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
using namespace std;
void trial1(){
string a = "\U00010000z";
cout << a << endl;
u16string b;
std::wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
b = converter.from_bytes(a);
u16string c = b.substr(0, 1);
string q = converter.to_bytes(c);
cout << q << endl;
}
void trial2(){
u16string a = u"\U00010000";
cout << a.length() << endl; // 2
std::wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
string b = converter.to_bytes(a);
}
int main() {
// both don't work
// trial1();
// trial2();
return 0;
}
我已经测试过 u16string
可以将 unicode 存储在 BMP 之外作为代理对,例如u"\U00010000"
存储为 2 char16_t
.
那么为什么 std::wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
对 trial1
和 trial2
都不起作用并抛出异常?
std::codecvt_utf8
不支持转换 to/from UTF-16,仅支持 UCS-2 和 UTF-32。您需要改用 std::codecvt_utf8_utf16
。
我正在尝试理解 C++ unicode,但现在这让我感到困惑。
代码:
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
using namespace std;
void trial1(){
string a = "\U00010000z";
cout << a << endl;
u16string b;
std::wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
b = converter.from_bytes(a);
u16string c = b.substr(0, 1);
string q = converter.to_bytes(c);
cout << q << endl;
}
void trial2(){
u16string a = u"\U00010000";
cout << a.length() << endl; // 2
std::wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
string b = converter.to_bytes(a);
}
int main() {
// both don't work
// trial1();
// trial2();
return 0;
}
我已经测试过 u16string
可以将 unicode 存储在 BMP 之外作为代理对,例如u"\U00010000"
存储为 2 char16_t
.
那么为什么 std::wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
对 trial1
和 trial2
都不起作用并抛出异常?
std::codecvt_utf8
不支持转换 to/from UTF-16,仅支持 UCS-2 和 UTF-32。您需要改用 std::codecvt_utf8_utf16
。