我想逐个字符地读取unicode文件(utf-8),但我不知道如何逐个字符地从文件中读取。
任何人都可以告诉我该怎么做。
编辑:我想逐一阅读文件
答案 0 :(得分:3)
首先,看看UTF-8如何编码字符:http://en.wikipedia.org/wiki/UTF-8#Description
每个Unicode字符都编码为一个或多个UTF-8字节。在您读取文件中的第一个下一个字节后,根据该表:
(第1行)如果最高位是0(char & 0x80 == 0
),那么你就有了自己的角色。
(第2行)如果三个最高有效位是110(char & 0xE0 == 0xc0
),则必须读取另一个字节,并且第一个UTF-8字节(110YYYyy)的第4,3,2位构成Unicode字符的第一个字节(00000YYY)和下一个字节(10xxxxxx)的6个最低有效位的两个最低有效位构成Unicode字符的第二个字节(yyxxxxxx);您可以轻松地使用C / C ++的移位和逻辑运算符进行位运算:
UnicodeByte1 = (UTF8Byte1 << 3) & 0xE0;
UnicodeByte2 = ( (UTF8Byte1 << 6) & 0xC0 ) | (UTF8Byte2 & 0x3F);
等等......
听起来有点复杂,但如果您知道如何修改位以将它们放在适当的位置来解码UTF-8字符串,那就不难了。
答案 1 :(得分:2)
UTF-8与ASCII兼容,因此您可以像读取ASCII文件一样读取UTF-8文件。将整个文件读入字符串的C ++方法是:
#include <iostream>
#include <string>
#include <fstream>
std::ifstream fs("my_file.txt");
std::string content((std::istreambuf_iterator<char>(fs)),
std::istreambuf_iterator<char>());
结果字符串包含与UTF-8字节对应的字符。你可以这样循环:
for(std::string::iterator i = content.begin();
i != content.end();
++i)
{
char nextChar = *i;
// do stuff here.
}
或者,您可以以二进制模式打开文件,然后以这种方式遍历每个字节:
std::ifstream fs("my_file.txt", std::ifstream::binary);
if(fs.is_open())
{
char nextChar;
while(fs.good())
{
fs >> nextChar;
// do stuff here.
}
}
如果你想做更复杂的事情,我建议你看看Qt。我发现它对这类东西很有用。至少,比ICU更少痛苦,因为做了很多实际的事情。
QFile file;
if(file.open("my_file.text")
{
QTextStream in(&file);
in.setCodec("UTF-8")
QString contents = in.readAll();
return
}
答案 2 :(得分:1)
理论上strlib.h有一个函数mblen,其中shell返回多字节符号的长度。但在我的情况下,它为多字节符号的第一个字节返回-1并继续它返回所有时间。所以我写下以下内容:
{
if(i_ch == nullptr) return -1;
int l = 0;
char ch = *i_ch;
int mask = 0x80;
while(ch & mask) {
l++;
mask = (mask >> 1);
}
if (l < 4) return -1;
return l;
}
比研究shell如何使用mblen花费更少的时间。
答案 3 :(得分:-2)
试试这个:获取文件,然后根据文本的长度循环显示文本
伪代码:
String s = file.toString();
int len = s.length();
for(int i=0; i < len; i++)
{
String the_character = s[i].
// TODO : Do your thing :o)
}