[英]C++: Reading alt-key symbols from file
我正在尝试从一个Unicode UTF-8文件读取Alt键符号,然后写入另一个文件。
输入文件看起来像这样>
ỊịỌọỤụṄṅ
输出文件如下所示>
239 187 191 225 187 138 225 187 139 225 187 140 225 187 141 225 187 164 225 187 165 225 185 132 225 185 133(每3位数组合后为'\\ n',而不是'')
码:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <Windows.h>
///convert as ANSI - display as Unicode
std::wstring test1(const char* filenamein)
{
std::wifstream fs(filenamein);
if(!fs.good())
{
std::cout << "cannot open input file [" << filenamein << "]\n" << std::endl;
return NULL;
}
wchar_t c;
std::wstring s;
while(fs.get(c))
{
s.push_back(c);
std::cout << '.' << std::flush;
}
return s;
}
int printToFile(const char* filenameout, std::wstring line)
{
std::wofstream fs;
fs.open(filenameout);
if(!fs.is_open())
return -1;
for(unsigned i = 0; i < line.length(); i++)
{
if(line[i] <= 126) //if its standard letter just print to file
fs << (char)line[i];
else //otherwise do this.
{
std::wstring write = L"";
std::wostringstream ss;
ss << (int)line[i];
write = ss.str();
fs << write;
fs << std::endl;
}
}
fs << std::endl;
//2nd test, also fails
char const *special_character[] = { "\u2780", "\u2781", "\u2782",
"\u2783", "\u2784", "\u2785", "\u2786", "\u2787", "\u2788", "\u2789" };
//prints out four '?'
fs << special_character[0] << std::endl;
fs << special_character[1] << std::endl;
fs << special_character[2] << std::endl;
fs << special_character[3] << std::endl;
fs.close();
return 1;
}
int main(int argc, char* argv[])
{
std::wstring line = test1(argv[1]);
if(printToFile(argv[2], line) == 1)
std::cout << "Writing success!" << std::endl;
else std::cout << "Writing failed!" << std::endl;
return 0;
}
我所期望的与该表中的值类似:
好的,根据您的代码和注释,我了解以下内容:
所以这是实际发生的事情:
您的代码一次正确地读取一个字节的文件,作为ANSI文件(就像它是Win1252编码的一样)。 然后,程序将显示所有字节的代码值。 我可以确认您在帖子中显示的字节列表是utf-8编码字符串ỊịỌọỤụṄṅ
,不同之处在于notepad ++在开始时添加了字节顺序标记(U + FEFF),而这在UTF8文件中通常不使用-BOM是3个字节239187191(十进制)或0xef 0xbb 0xbf(十六进制)
那你该怎么办?
一种简单的解决方案(使用Windows时)是要求notepad ++将文件编码为UTF16LE,这是Windows中的本机unicode格式。 这样,您实际上将读取unicode字符。
另一种方法是指示您的代码将文件作为UTF8处理。 在Linux上这是微不足道的,但在Windows上却很难,因为从VC2010开始仅对UTF8进行了正确处理。 SO的另一篇文章展示了如何在C ++流中注入UTF8语言环境。
很抱歉没有提供代码,但是我只有一个不支持UTF8流的旧VC2008 ...而且我讨厌提供未经测试的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.