2013-09-26 4 views
-1

У меня есть текстовый файл, который может иметь разные кодировки (ASCII, UTF-8, UTF-16, UTF-32). Лучшая часть заключается в том, что она заполнена только с числами, например:Преобразование unicode в ascii

192848292732

Мой вопрос: будет ли функция, как один пыльник иметь возможность корректно отображать все данные? Если не так? (Я загрузил файл в виде строки в строку контейнера)

function output(container: AnsiString): AnsiString; 
var 
    i: Integer; 
begin 
    Result := ''; 
    for i := 1 to Length(container) do 
    if (Ord(container[i]) <> 0) then 
     Result := Result + container[i]; 
end; 

Моя логика такова, что если кодировка отличается, то ASCII и UTF-8 дополнительными символы равна 0?

Он проходит все тесты просто отлично.

+2

Что такое строка? AnsiString или UnicodeString? Как вы можете задать вопрос в Unicode без указания версии Delphi ?! Как вы предлагаете работать с спецификациями? –

+0

@DavidHeffernan Я использую delphi 7, String - это AnsiString witch содержит байты, загруженные из файла, 0 представляет собой байт 0 Я предполагаю, что байт 0 является фиктивным, и я разделяю его на оставшуюся чистую строку ascii. Это правильно ? – opc0de

+0

@SertacAkyuz да, я отредактирую свой вопрос взамен – opc0de

ответ

3

Набор символов ASCII использует коды 0-127. В Unicode эти символы сопоставляются с кодовыми точками с одинаковым числовым значением. Таким образом, вопрос сводится к тому, как каждый из кодов представляет собой коды 0-127.

  • UTF-8 кодирует коды 0-127 в одном байте, содержащем значение кодовой точки. Другими словами, если полезная нагрузка ASCII, то нет никакой разницы между кодировкой ASCII и UTF-8.
  • UTF-16 кодирует коды 0-127 в двух байтах, один из которых равен 0, а другой - код ASCII.
  • UTF-32 кодирует коды 0-127 в четырех байтах, три из которых равны 0, а оставшийся байт - код ASCII.

Ваш предложенный алгоритм не сможет обнаружить код ASCII 0 (NUL). Но вы указываете, что в файле нет символа.

Единственная проблема, которую я вижу с вашим предлагаемым кодом, заключается в том, что он не распознает знак байта (BOM). Они могут присутствовать в начале файла, и я думаю, вы должны их обнаружить и пропустить.

Сказав все это, ваша реализация кажется странной для меня. Кажется, вы указываете, что файл содержит только числовые символы. В этом случае ваш тест может одинаково хорошо быть:

if container[i] in ['0'..'9'] then 
    ......... 

Если вы использовали этот код, то вы также случиться, чтобы пропустить спецификацию, если бы присутствовать.

+0

Я понимаю спасибо за вашу помощь. – opc0de

+2

@DavidHeffernan: Не следует ли выражать выражение «container [i] в ​​['0' .. '9']"? –

+0

@HeartWare благодарит за изменение –

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