我有一个文本文件,我正在添加标签以使其可读取XML。为了让我们的读者将其识别为有效,每行必须至少包含在标签中。我的问题出现了,因为这实际上是一个叙利亚语翻译词典,因此有许多非标准字符(实际的叙利亚语字)。我看到完成我需要的最直接的方法是简单地在每个行前面添加所需的标签,而不必访问或修改其余的行。任何其他选择也将非常感激。
ifstream in_file;
string file_name;
string line;
string line2;
string pre_text;
string post_text;
int num = 1;
pre_text = "<entry n=\"";
post_text = "</entry>";
file_name = "D:/TEI/dictionary1.txt";
in_file.open(file_name.c_str());
if (in_file.is_open()){
while (getline(in_file, line)){
line2 = pre_text + to_string(num) + "\">" + line + post_text;
cout << line2;
num++;
}
}
可以下载相关文件here.
答案 0 :(得分:2)
您正在使用std::string
,默认情况下处理ASCII编码文本,并且您将以“文本翻译模式”打开文件。您需要做的第一件事是以二进制模式打开文件,以便它不会对单个char
值执行转换:
in_file.open(file_name.c_str(), std::ios::binary);
或在C ++ 11中
in_file.open(file_name, std::ios::binary);
接下来就是停止使用std :: string来存储文件中的文本。您将需要一个字符串类型,它识别您正在使用的字符编码并使用适当的字符类型。
事实证明,std::string
实际上是std::basic_string<char>
的别名。在C ++ 11中引入了几个新的unicode字符类型,在C ++ 03中有wchar_t
支持“宽”字符(超过8位)。 basic_string
的{{1}} s wchar_t
有一个标准别名。{/ 1}}。
从以下简单测试开始:
std::wstring
请注意#include <iostream>
#include <fstream>
#include <string>
int main() {
std::string file_name = "D:/TEI/dictionary1.txt";
std::wifstream in_file(file_name, std::ios::binary);
if (!in_file.is_open()) {
// "L" prefix indicates a wide string literal
std::wcerr << L"file open failed\n";
return 1;
}
std::wstring line1;
std::getline(in_file, line1);
std::wcout << L"line1 = " << line1 << L"\n";
}
等也会以cout
...
标准ASCII字符集包含128个字符,编号为0到127.在ASCII w
中,\n
分别用7位值13和10表示。
您的文本文件似乎是UTF-8编码的。 UTF-8使用8位无符号表示,允许字符使用可变数量的字节:值\r
需要1个字节,值0
需要2个字节,值8192需要3个字节,等等。
具有最高位(2 ^ 7)清除的值是单个7位ascii值或多字节序列的结尾。如果设置了最高位,则较低位被认为是“前缀值”。因此,字节序列128
将表示值{ (128+2), 0 }
或(2 << 7) | 0
。字节序列(wchar_t)256
代表{ 130, 13 }
或(2 << 7) | 13
。
您可以通过wchar_t 269
流和存储读取和写入utf-8 值,但仅作为不透明的字节流。您开始需要了解价值时,通常需要求助char
,wchar_t
或uint16_t
等。
如果您正在使用Microsoft的工具集(注意“D:/”路径),您可能需要查看uint32_t
(https://msdn.microsoft.com/en-us/library/c426s321.aspx)