我在C ++中遇到了非Ascii字符的一些问题。我有一个包含非ascii字符的文件,我通过文件处理在C ++中阅读。在读取文件(比如1.txt)之后,我将数据存储到字符串流中并将其写入另一个文件(比如2.txt)。
假设1.txt包含:
ação
在2.txt中,我应该得到相同的输出但非Ascii字符在2.txt中打印为Hex值。
另外,我很确定C ++只将Ascii字符作为Ascii处理。
请帮助您了解如何在2.txt
中正确打印这些字符编辑:
首先是整个过程的Psuedo代码:
1.Shell script to Read from DB one Value and stores in 11.txt
2.CPP Code(a.cpp) reading 11.txt and Writing to f.txt
正在读取的数据库中的数据:Instalação
文件11.txt包含:Instalação
文件F.txt包含:Instalação
屏幕上a.cpp的输出:Instalação
a.cpp
#include <iterator>
#include <iostream>
#include <algorithm>
#include <sstream>
#include<fstream>
#include <iomanip>
using namespace std;
int main()
{
ifstream myReadFile;
ofstream f2;
myReadFile.open("11.txt");
f2.open("f2.txt");
string output;
if (myReadFile.is_open())
{
while (!myReadFile.eof())
{
myReadFile >> output;
//cout<<output;
cout<<"\n";
std::stringstream tempDummyLineItem;
tempDummyLineItem <<output;
cout<<tempDummyLineItem.str();
f2<<tempDummyLineItem.str();
}
}
myReadFile.close();
return 0;
}
Locale说:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
答案 0 :(得分:2)
至少如果我理解你所追求的是什么,我会做这样的事情:
#include <iterator>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <iomanip>
std::string to_hex(char ch) {
std::ostringstream b;
b << "\\x" << std::setfill('0') << std::setw(2) << std::setprecision(2)
<< std::hex << static_cast<unsigned int>(ch & 0xff);
return b.str();
}
int main(){
// for test purposes, we'll use a stringstream for input
std::stringstream infile("normal stuff. weird stuff:\x01\xee:back to normal");
infile << std::noskipws;
// copy input to output, converting non-ASCII to hex:
std::transform(std::istream_iterator<char>(infile),
std::istream_iterator<char>(),
std::ostream_iterator<std::string>(std::cout),
[](char ch) {
return (ch >= ' ') && (ch < 127) ?
std::string(1, ch) :
to_hex(ch);
});
}
答案 1 :(得分:1)
听起来像是一个utf8问题。由于您没有使用c ++ 11标记您的问题Here这是一篇关于unicode和c ++流的优秀文章。
从您更新的代码中,让我解释一下发生了什么。您创建一个文件流来读取您的文件。在内部,文件流仅识别chars
,否则直到您告知它为止。在大多数机器上,char
只能容纳8位数据,但文件中的字符使用的位数超过8位。为了能够正确读取您的文件,您需要知道它是如何编码的。最常见的编码是UTF-8,每个字符使用1到4 chars
。
了解编码后,您可以使用wifstream(适用于UTF-16)或imbue()
语言环境进行其他编码。
更新: 如果您的文件是ISO-88591(来自上面的评论),请尝试此操作。
wifstream myReadFile;
myReadFile.imbue(std::locale("en_US.iso88591"));
myReadFile.open("11.txt");