【发布时间】:2017-04-12 22:39:41
【问题描述】:
正如标题所述,我正在尝试将 UTF-8 字符解码/编码为 char,但我想在不使用 wchar_t 等的情况下执行此操作。我想自己做腿部工作。这样我就知道我明白了,我显然不明白,否则它会起作用。我已经花了大约一个星期的时间来玩弄它,只是没有取得进展。
我尝试了几种方法,但似乎总是产生不正确的结果。我最近的尝试:
ifstream ifs(FILENAME);
if(!ifs) {
cerr << "Open: " << FILENAME << "\n";
exit(1);
}
char in;
while (ifs >> std::noskipws >> in) {
int sz = 1;
if ((in & 0xc0) == 0xc0) //0xc0 = 0b11000000
{
sz++;
if((in & 0xE0) == 0xE0) //0xE0 = 0b11100000
{
sz++;
if((in & 0xF0) == 0xF0) //0xF0 = 0b11110000
sz++;
}
}
cout << sz << endl;
unsigned int a = in;
for(int i = 1; i < sz; i++) {
ifs >> in;
a += in;
}
为什么这段代码不起作用?我简直不明白。
编辑:复制+粘贴意大利面条...两个不同的变量名称
【问题讨论】:
-
呃,
wchar_t不会神奇地转换任何东西。它甚至不是标准的——它是一个黑客。使用适当大小的字符类型,例如char16_t或char32_t如果您将 UTF-8 解码为更宽的字符。至于您的问题,您没有说什么不起作用,也没有显示c是什么数据类型。您的意思是要测试in的值(您在循环中读取)而不是c?您是否尝试过使用调试器单步执行您的代码? -
您能否更清楚地了解您将
UTF-8编码/解码到/从什么? -
另外,既然你希望重新实现而不是使用标准函数,你最好read the Unicode Standard。 9.0.0 版只有 1036 页。享受吧!
-
顺便说一句,C++14 允许直接在代码中使用像
0b11000000这样的二进制文字。它还允许0b1100'0000分隔数字。 -
是的,很抱歉 c 在里面,长度是 sz 我已经编辑了 OP 来反映。
标签: c++ utf-8 character-encoding