2011-01-27 2 views
3

Я пытаюсь сохранить некоторые строки текста в кодировке, отличной от моей системы, такой как кириллица, к TFileStream, используя Delphi XE. Однако я не могу найти образец кода для создания закодированного файла?Как использовать TEncoding от Delphi XE для сохранения текста кириллицы или ShiftJis в файл?

Я пробовал использовать тот же код, что и TStrings.SaveToStream, однако я не уверен, что я его правильно реализовал (например, часть WriteBom) и хотел бы знать, как это будет сделано в другом месте. Вот мой код:

FEncoding := TEncoding.GetEncoding(1251); 
FFilePool := TObjectDictionary<string,TFileStream>.Create([doOwnsValues]); 

//... 

procedure WriteToFile(const aFile, aText: string); 
var 
    Preamble, Buffer: TBytes; 
begin 
    // Create the file if it doesn't exist 
    if not FFilePool.ContainsKey(aFile) then 
    begin 
    // Create the file 
    FFilePool.Add(aFile, TFileStream.Create(aFile, fmCreate)); 
    // Write the BOM 
    Preamble := FEncoding.GetPreamble; 
    if Length(Preamble) > 0 then 
    FFilePool[aFile].WriteBuffer(Preamble[0], Length(Preamble)); 
    end; 
    // Write to the file 
    Buffer := FEncoding.GetBytes(aText); 
    FFilePool[aFile].WriteBuffer(Buffer[0], Length(Buffer)); 
end; 

Заранее спасибо.

+1

Почему бы тебе не показать нам свой код, а затем мы можем прокомментировать? Но я бы сказал, что для кодовой страницы ANSI для Windows, 1251, не требуется спецификация. –

+0

@David: Я редактировал исходное сообщение с моим примером кода. Как я могу узнать, какая кодовая страница нуждается в спецификации? Является ли длина (преамбула)> 0 частью той, что говорит о спецификации? – jonjbar

+0

Что касается спецификаций, ни одна из 8-разрядных кодовых страниц ANSI (например, кириллица не указана) нуждается в спецификации. Вы получаете спецификации на UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. У вас даже нет спецификации по всем этим - вы чаще просматриваете спецификации в Windows, чем на других платформах. –

ответ

2

Если я понимаю, это довольно просто. Объявите AnsiString с сродством к кириллице 1251:

type 
    // The code page for ANSI-Cyrillic is 1251 
    CyrillicString = type AnsiString(1251); 

Затем назначьте Unicode строку в одном из них:

var 
    UnicodeText: string; 
    CyrillicText: CyrillicString; 
.... 
    CyrillicText := UnicodeText; 

Вы можете написать CyrillicText к ручью в традиционной манере:

if Length(CyrillicText)>0 then 
    Stream.WriteBuffer(CyrillicText[1], Length(CyrillicText)); 

Не должно быть спецификации для ANSI-кодированного текстового файла.

+0

Это также работает для Delphi 7? – menjaraz

+0

@menjaraz Нет. Вам нужно использовать [WideCharToMultiByte] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130 (v = vs.85) .aspx) –

4

Не уверен, какой пример вы ищете; может быть следующее может помочь - пример преобразования Юникода строки (SL) в ANSI кириллицы:

procedure SaveCyrillic(SL: TStrings; Stream: TStream); 
var 
    CyrillicEncoding: TEncoding; 

begin 
    CyrillicEncoding := TEncoding.GetEncoding(1251); 
    try 
    SL.SaveToStream(Stream, CyrillicEncoding); 
    finally 
    CyrillicEncoding.Free; 
    end; 
end; 
+0

Спасибо, однако, используя этот метод Сначала я должен сначала преобразовать строку в TStrings, которая кажется большим хитом производительности, и поэтому я упомянул, что я извлек метод TStrings.SaveToStream. – jonjbar

 Смежные вопросы

  • Нет связанных вопросов^_^