Акцент кодировки - PullRequest
       30

Акцент кодировки

1 голос
/ 12 октября 2011

Я пытаюсь прочитать строку с акцентами в Delphi. Я не знаю настоящую кодировку строки. Я полагаю, это ЮНИКОД.

Моя проблема с акцентами.

Когда я читаю это как UNICODE, символ é отображается как e (2 символа: e и ')

та же проблема для è который рассматривается как e` (2 символа: e и `)

Почему это?

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 12 октября 2011

Unicode имеет два режима композиции . Это объясняется в этом документе ICU . Очевидно, что строка, которую вы читали, использует режим декомпозиция (поэтому é кодируется как e и ´). Windows по умолчанию использует режим precomposed , где é кодируется как отдельный символ.

Преобразование из одного режима в другой имеет смысл, если вы хотите сравнить строки. Однако не существует единого способа сделать это. Документ ICU дает некоторую помощь.

Режим композиции должен, если все сделано правильно , не иметь никакого значения на экране.

Обновление

В этой статье MSDN объясняется немного больше о том, как нормализовать строки Unicode в Windows.

2 голосов
/ 12 октября 2011

Если ваша проблема действительно в неправильном режиме компоновки, как догадывается Руди, то функция WideCharToMultiByte может помочь вам преобразовать строку в предварительно скомпонованный режим.См. Примечание «WC_COMPOSITECHECK и соответствующие флаги» в конце справки WideCharToMultiByte.

1 голос
/ 12 октября 2011

Вероятной причиной появления отдельных диакритических знаков является потеря данных при преобразовании Unicode -> ANSI.Вот пример кода (Delphi 2009):

type
  Str1252 = type AnsiString(1252);

var
  S, S2: string;
  S1: Str1252;

begin
  SetLength(S, 2);
  S[1]:= Char($0041);
  S[2]:= Char($0301);
  S1:= S;   // Ord(S1[2]) = $B4; the compiler issues warning W1058:
            // Implicit string cast with potential data loss from 'string' to 'Str1252'
  S2:= S1;  // Ord(S2[2]) = $B4
  ShowMessage(S + ' --> ' + S2);  // Á --> A´
end;
...