Текстовый файл C ++, китайские иероглифы - PullRequest
0 голосов
/ 06 января 2011

У меня есть проект C ++, который должен добавить <item> в начало каждой строки и </item > в конец каждой строки.Это нормально работает с обычным английским текстом, но у меня есть текстовый файл на китайском языке, с которым я бы хотел это сделать, но он не работает.Я обычно использую файлы .txt, но для этого мне нужно использовать .rtf для сохранения китайского текста.После того, как я запускаю свой код, он становится бессмысленным.Вот пример.

{\ rtf1 \ adeflang1025 \ ansi \ ansicpg1252 \ uc1 \ adeff31507 \ deff0 \ stshfdbch31506 \ stshfloch31506 \ stshfhich31506 \ stshfbi31507 \ stshfbi31507 \лантист\ f2 \ fbidi \ fmodern \ fcharset0 \ fprq1 {* \ panose 02070309020205020404} Курьер Новый;}

Код:

int main()
{
    ifstream in;
    ofstream out;
    string lineT, newlineT;

    in.open("rawquote.rtf");
    if(in.fail())
       exit(1);
    out.open("itemisedQuote.rtf");
    do
    {
        getline(in,lineT,'\n');
        newlineT += "<item>";
        newlineT += lineT;
        newlineT += "</item>";
        if (lineT.length() >5)
        {
            out<<newlineT<<'\n';
        }
        newlineT = "";
        lineT = "";
    } while(!in.eof());
    return 0;
}

Ответы [ 5 ]

1 голос
/ 06 января 2011

Это чудо, что это работает для некитайского текста. «\ n» не является разделителем строк в RTF, «\ par» - это. Шансы на то, что больший урон нанесен заголовку RTF, безусловно, больше для китайцев.

C ++ - не лучший язык для решения этой проблемы. Это простая 5-минутная программа на C #, если файл не становится слишком большим:

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);
    }
}

Если C ++ является жестким требованием, вам придется найти анализатор RTF.

1 голос
/ 06 января 2011

Вы не можете читать код RTF так же, как обычный текст, поскольку вы просто игнорируете теги формата и т. Д. И можете просто нарушить код.

Попробуйте сохранить свой китайский текст в виде текстафайл с использованием UTF-8 (без спецификации), и ваш код должен работать.Однако это может не сработать, если какой-либо другой символ в кодировке UTF-8 содержит, по сути, разрыв строки (сейчас не уверен насчет этой части), поэтому вам следует попытаться выполнить настоящее преобразование UTF-8 и прочитать файл, используя широкие символы вместо обычных символовкак предложил Чан), что немного сложно с использованием C ++.

1 голос
/ 06 января 2011

Это выглядит как RTF , что имеет смысл, когда вы говорите, что это файл 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;
}
0 голосов
/ 06 января 2011

Если я понимаю цель этого кода, ваше решение не будет работать. Разрыв строки в документе RTF не соответствует разрыву строки в видимом тексте.

Если вы не можете просто использовать обычный текст (китайские символы не являются проблемой при правильной кодировке), взгляните на RTF spec . Вы обнаружите, что это кошмар. Таким образом, вам лучше всего делать ставку на сторонние библиотеки, которые могут анализировать RTF и читать его «строка» за «строка». Я никогда не искал такую ​​библиотеку, поэтому у меня нет никаких предложений, но я уверен, что они есть.

0 голосов
/ 06 января 2011

Я думаю, вы должны использовать 'wchar' для строки вместо 'обычный символ'.

...