А у вас это действительно unicode?!!
Да:
- Код: Выделить всё
C:\data\temp\unicode.txt
0000000000: D0 AE D0 BD D0 B8 D0 BA │ D0 BE D0 B4 20 22 D0 AE Ю›н›и›к›о›д› "Ю›
0000000010: D0 AE D0 AE D0 AE D0 AE │ D0 AE D0 AE D0 AE D0 9D Ю›Ю›Ю›Ю›Ю›Ю›Ю›Н›
0000000020: D0 98 D0 98 D0 98 D0 98 │ D0 98 D0 98 D0 98 D0 98 И›И›И›И›И›И›И›И›
0000000030: D0 98 D0 98 D0 98 D0 98 │ D0 98 D0 98 D0 9A D0 9E И›И›И›И›И›И›К›О›
0000000040: D0 9E D0 9E D0 9E D0 9E │ D0 94 21 21 21 22 20 D0 О›О›О›О›Д›!!!" Ю
0000000050: AE D0 BD D0 B8 D0 BA D0 │ BE D0 B4 0D 0A 22 C2 AB ›н›и›к›о›д›♪◙"«›
0000000060: 49 20 6C 6F 76 65 20 75 │ 6E 69 63 6F 64 65 C2 BB I love unicode»›
0000000070: 20 E2 80 94 20 D0 B3 D0 │ BE D0 B2 D0 BE D1 80 D0 —›› г›о›в›о›р›и
0000000080: B8 D1 82 20 D0 BD D0 B0 │ D0 BC 20 D0 9A D1 80 D0 ›т› н›а›м› К›р›о
0000000090: BE D0 BB D0 B8 D0 BA 22 │ 0D 0A 22 D0 A2 D1 80 D0 ›л›и›к›"♪◙"Т›р›и
00000000A0: B8 22 20 22 D1 8E D0 BD │ D0 B8 D0 BA D0 BE D0 B4 ›" "ю›н›и›к›о›д›
00000000B0: D0 BD D1 8B D1 85 20 D1 │ 86 D0 B8 D1 82 D0 B0 D1 н›ы›х› ц›и›т›а›т
00000000C0: 82 D1 8B 22 20 22 D0 B2 │ 20 D0 BE D0 B4 D0 BD D0 ›ы›" "в› о›д›н›о
00000000D0: BE D0 B9 20 D1 81 D1 82 │ D1 80 D0 BE D0 BA D0 B5 ›й› с›т›р›о›к›е›
00000000E0: 22 0D 0A D0 90 20 D1 82 │ D1 83 D1 82 20 D0 BD D0 "♪◙А› т›у›т› н›и
00000000F0: B8 D1 84 D0 B8 D0 B3 D0 │ B0 0D 0A ›ф›и›г›а›♪◙
а) двухбайтовая кодировка символов - которые надо сравнивать/обрабатывать и желательно не вручную
Вы хотите обрабатывать utf-8 или utf-16 файлы? Под словом «юникод» обычно подразумевают кодировку utf-8
б) перевод строк в виде "000D 000A" - который меня просто УБИВАЕТ! И который не обрабатывается нормально стандартными функциями ReadLn и WriteLn.
Это уже что-то :)
Проблема в том, что юникод — слишком обширная тема, и я не готов (да и не смогу) в коротком форумном посте рассказать все тонкости и нюансы его использования на все случаи жизни.
Конкретно под данную задачу программу можно написать так:
- Код: Выделить всё
{$MODE OBJFPC}
{$H+}
{$PACKENUM 1}
{$codepage UTF8}
{$IFNDEF windows} // Ну а вдруг?
uses
cwstring;
{$ENDIF}
var
Line: UnicodeString;
C: UnicodeChar;
Mode: Boolean;
begin
if ParamStr(1) <> '' then begin
Assign(input, ParamStr(1));
Reset(input);
end;
if ParamStr(2) <> '' then begin
Assign(output, ParamStr(2));
Rewrite(output);
end;
while not Eof do begin
Readln(Line);
Mode := False;
for C in Line do
if C <> '"' then begin
if Mode then begin
Write(C);
end;
end else
Mode := not Mode;
Writeln(' END_OF_LINE_MARKER'); // просто для проверки, что две строки файла не прочлись как одна
end;
end.
Я специально подготовил входной файл со всеми тремя основными типами концов строк
- Код: Выделить всё
"ЮНИКОД!"
"Кролик!"
"АЗАЗИЙ"
"«»—" "и т.д" "и т.п."
и его концы строк выровнены в дампе по правому краю для того, чтобы их было проще увидеть:
- Код: Выделить всё
C:\data\temp\unicode.txt
0000000000: 22 D0 AE D0 9D D0 98 D0 │ 9A D0 9E D0 94 21 22 0D "Ю›Н›И›К›О›Д›!"♪
0000000010: 22 D0 9A D1 80 D0 BE D0 │ BB D0 B8 D0 BA 21 22 0A "К›р›о›л›и›к›!"◙
0000000020: 22 D0 90 D0 97 D0 90 D0 │ 97 D0 98 D0 99 22 0D 0A "А›З›А›З›И›Й›"♪◙
0000000030: 22 C2 AB C2 BB E2 80 94 │ 22 20 22 D0 B8 20 D1 82 "«›»›—››" "и› т›
0000000040: 2E D0 B4 22 20 22 D0 B8 │ 20 D1 82 2E D0 BF 2E 22 .д›" "и› т›.п›."
0000000050: 0A │ ◙
Запуск программы на данном файле:
- Код: Выделить всё
C:\data\temp> fpc -gl q.pas && rm -f unicode.out && q.exe unicode.txt unicode.out && type unicode.out
Free Pascal Compiler version 3.0.0rc1 [2015/08/10] for i386
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling q.pas
Linking q.exe
37 lines compiled, 0.2 sec, 36416 bytes code, 1316 bytes data
ЮНИКОД! END_OF_LINE_MARKER
Кролик! END_OF_LINE_MARKER
АЗАЗИЙ END_OF_LINE_MARKER
«»—и т.ди т.п. END_OF_LINE_MARKER