C++;文本文件,中文字符 我有一个C++项目,它应该在每行的开头加上 ,并将代码> 到每行的末尾。这适用于正常的英文文本,但我有一个中文文本文件,我想这样做,但它不工作。我通常使用.txt文件,但为此我必须使用.rtf来保存中文文本。在我运行代码之后,它就变成了胡言乱语。这里有一个例子
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangf0\themelangcs0{\fonttbl\f2\fbidi \fmodern\fcharset0\fprq1{*\panose 0207309020205020404}快递员 新的;} 代码:C++;文本文件,中文字符 我有一个C++项目,它应该在每行的开头加上 ,并将代码> 到每行的末尾。这适用于正常的英文文本,但我有一个中文文本文件,我想这样做,但它不工作。我通常使用.txt文件,但为此我必须使用.rtf来保存中文文本。在我运行代码之后,它就变成了胡言乱语。这里有一个例子,c++,internationalization,rtf,cjk,C++,Internationalization,Rtf,Cjk,{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangf0\themelangcs0{\fonttbl\f2\fbidi \fmodern\fcharset0\fprq1{*\panose 02073090202050204
intmain()
{
如果输入;
流出的液体;
字符串lineT,newlineT;
in.open(“rawquote.rtf”);
if(in.fail())
出口(1);
out.open(“itemisedQuote.rtf”);
做
{
getline(in,lineT,'\n');
换行符+=“”;
newlineT+=lineT;
换行符+=“”;
如果(lineT.length()>5)
{
out看起来像,这很有意义,因为您说这是一个rtf文件
基本上,如果你打开时转储文件,你会看到它看起来像
此外,您应该重新访问您的循环
std::string line;
while(getline(in, line, '\n'))
{
// do stuff here, the above check correctly that you have indeed read in a line!
out << "<item>" << line << "</item>" << endl;
}
std::字符串行;
while(getline(in,line,'\n'))
{
//在这里做一些事情,正确地检查上面的内容,确保你确实读了一行!
out看起来像,这很有意义,因为您说这是一个rtf文件
基本上,如果你打开时转储文件,你会看到它看起来像
此外,您应该重新访问您的循环
std::string line;
while(getline(in, line, '\n'))
{
// do stuff here, the above check correctly that you have indeed read in a line!
out << "<item>" << line << "</item>" << endl;
}
std::字符串行;
while(getline(in,line,'\n'))
{
//在这里做一些事情,正确地检查上面的内容,确保你确实读了一行!
我认为你应该用“wchar”来表示字符串而不是“普通字符”。我认为你应该用“wchar”来表示字符串而不是“普通字符”。你不能像普通文本那样读取RTF代码,因为你只会忽略格式标记等,可能会破坏代码
尝试使用UTF-8(无BOM)将中文文本保存为文本文件,您的代码应该可以工作。但是,如果其他UTF-8编码字符基本上包含换行符(目前不确定这部分),则可能会失败,因此您应该尝试进行真正的UTF-8转换,并使用宽字符而不是常规字符读取文件(正如Chan所建议的),使用C++有点棘手。< P>你不能像纯文本一样读取RTF代码,因为你只会忽略格式标签等等,可能只是破解代码。
尝试使用UTF-8(无BOM)将中文文本保存为文本文件,您的代码应该可以工作。但是,如果其他UTF-8编码字符基本上包含换行符(目前不确定这部分),则可能会失败,因此您应该尝试进行真正的UTF-8转换,并使用宽字符而不是常规字符读取文件(如Chan所建议的),使用C++有点棘手。 如果我理解这个代码的目标,你的解决方案就不起作用。RTF文档中的行中断与可见文本中的断线不符。
如果你不能只使用纯文本(汉字对于有效的编码来说不是问题),那么看看。你会发现这是一场噩梦。所以你最好的选择可能是一个第三方库,它可以解析RTF并逐行读取我从未寻找过这样的库,因此我没有任何建议,但我确信它们确实存在。如果我理解此代码的目的,您的解决方案将不起作用。RTF文档中的换行符与可见文本中的换行符不对应
如果你不能只使用纯文本(汉字对于有效的编码来说不是问题),那么看看。你会发现这是一场噩梦。所以你最好的选择可能是一个第三方库,它可以解析RTF并逐行读取我从来没有寻找过这样的库,所以我没有任何建议,但我确信它们确实存在。这对于非中文文本来说是一个奇迹。“\n”不是RTF中的行分隔符,“\par”是。对中文来说,RTF标题造成更大损害的可能性当然更大
C++不是解决这一问题的最佳语言。只要文件不太大,它在C#中只是一个5分钟的小程序:
using System;
using System.Windows.Forms; // Add reference
class Program {
static void Main(string[] args) {
var rtb = new RichTextBox();
rtb.LoadFile(args[0], RichTextBoxStreamType.RichText);
var lines = rtb.Lines;
for (int ix = 0; ix < lines.Length; ++ix) {
lines[ix] = "<item>" + lines[ix] + "</item>";
}
rtb.Lines = lines;
rtb.SaveFile(args[0], RichTextBoxStreamType.RichText);
}
}
使用系统;
使用System.Windows.Forms;//添加引用
班级计划{
静态void Main(字符串[]参数){
var rtb=new RichTextBox();
加载文件(args[0],RichTextBoxStreamType.RichText);
var线=rtb线;
对于(int-ix=0;ix
<如果C++是一个硬的要求,那么你必须找到一个RTF解析器。 这是一个奇迹,这对于非中文文本来说是一种奇迹。“\n”不是RTF中的行分隔符,“\PAR”是。对RTF头的更多伤害的可能性对于汉语来说肯定更大。< /P>
C++不是解决这一问题的最佳语言。只要文件不太大,它在C#中只是一个5分钟的小程序:
using System;
using System.Windows.Forms; // Add reference
class Program {
static void Main(string[] args) {
var rtb = new RichTextBox();
rtb.LoadFile(args[0], RichTextBoxStreamType.RichText);
var lines = rtb.Lines;
for (int ix = 0; ix < lines.Length; ++ix) {
lines[ix] = "<item>" + lines[ix] + "</item>";
}
rtb.Lines = lines;
rtb.SaveFile(args[0], RichTextBoxStreamType.RichText);
}
}
使用系统;
使用System.Windows.Forms;//添加引用
班级计划{
静态void Main(字符串[]参数){
var rtb=new RichTextBox();
加载文件(args[0],RichTextBoxStreamType.RichText);
var线=rtb线;
对于(int-ix=0;ix
如果C++是一个硬的需求,那么你必须找到一个RTF解析器。< /P>在一个文本的mod中查看RAWQUTE.RTF输入文件。