FormatDateTime с китайским расположением - неправильные символы ... Delphi 2007 - PullRequest
0 голосов
/ 11 января 2011

Вывод: Период: с 11-го по 10-й до 13-го по 10-й

Выше приведен вывод такой строки: FormatDateTime ('dd-mmm-yy', dateValue)

Средой разработки является Delphi 2007, и мы пытаемся перенести наше приложение на китайский рынок.Как я могу отображать правильные символы?

При установке на хинди (Индия) вместо забавных символов у меня появляется "?".

Я пытаюсь отобразить датув отчете, используя ReportBuilder 11.

Любая помощь будет высоко ценится.

Ответы [ 4 ]

2 голосов
/ 11 января 2011

Другим решением является использование TntControls.Это набор стандартных элементов управления Delphi, улучшенных для поддержки Unicode.Вам нужно будет просмотреть все ваши файлы форм и заменить

Button1: TButton
Label1: TLabel

на TTntButton, TTntLabel и так далее.

Обратите внимание, что в настоящее время не только китайский язык не будетРабота.Попробуйте любой язык, использующий символы, отличные от стандартного европейского набора (латинский + знаки напряжения и т. Д.), Например русский.

Но

Заменив элементы управления, вы решите одну часть проблемы.Другая часть заключается в том, что везде, где вы используете «string» или «AnsiString» и «char / pchar» или «AnsiChar / PAnsiChar», вы можете хранить только строки в кодировке системы по умолчанию.

Например, если ваша системакодировка («Язык для программ, не поддерживающих Юникод») - EN / US, русские символы будут заменены на вопросительные знаки при назначении их для переменной «string»:

a: WideString;
b: string;
...
a := 'ЯУЭФЫЦ'; //WideString can store international characters
b := a; //string cannot, so the data is lost - you cannot restore it from just "b"

Для хранения строковых данных, которые являются независимымикодирования системы, используйте WideString / WideChar / PWideChar и соответствующие функции .Если у вас есть

a, b: WideString;
...
a := UpperCase(b);

, тогда информация Юникода будет по-прежнему потеряна, потому что UpperCase () принимает «строку»:

function UpperCase(const S: string): string;

Ваша WideString будет преобразована в «строку» (при этом теряются всесимволов), переданный в UpperCase, тогда результат будет преобразован обратно в WideString, но уже слишком поздно.

Поэтому необходимо заменить все строковые функции на широкие версии:

a := WideUpperCase(b);

(для некоторых функций их широкие версии недоступны или называются по-разному, TntControls также содержат несколько версий широких функций)

2 голосов
/ 11 января 2011

Символы кажутся правильными, только IMO они были отображены неправильно.

Вот что я сделал:

  • скопировал строку, представленную OP («11-Ê®¶þÔÂ-10 до 13-Ê®¶þÔÂ-10»);
  • вставил его в пустое текстовое окно редактора с CP 1252 (Windows Latin-1) и сохранил;
  • открыл текстовый файл в браузере;
  • текст показывался так же, как браузер выбрал ту же кодовую страницу, поэтому я включил автоматическое определение кодировки символов, намекая на то, что содержимое было китайским;
  • текст изменился на «11- 十二月 -10 до 13- 十二月 -10» (надеюсь, ваш браузер отображает правильные китайские иероглифы здесь, мой в любом случае делает это), а кодовая страница изменилась на GB18030 (и тогда я попробовал GB2312 , но текст не изменится);
  • Что ж, мне было любопытно, и я искала «十二月», и оказалось, что это означает «декабрь», вполне подходит для контекста, если названия месяцев не были перепутаны.

Итак, вот почему я думаю, что это проблема с отображением текста (или как бы вы это ни называли, я не совсем уверен в этом термине).

РЕДАКТИРОВАТЬ: Конечно, это должно быть как-то связано с типом данных, выбранным для хранения строки. Если результат функции - AnsiString, а переменная - WideString, то, возможно, символы преобразуются в WideChars, и поэтому они больше не являются однобайтовыми соединениями многобайтовых символов, а являются многобайтовыми символами сами по себе? По крайней мере, так произошло, когда ОП разместил их здесь.

На самом деле я не знаю, но если это так, то я сомневаюсь, что они могут быть правильно отображены, если не преобразованы обратно и не представлены как часть AnsiString.

0 голосов
/ 11 января 2011
  1. Установили ли вы поддержку Дальнего Востока в Windows? В Windows pre 7 (или Vista) эти кодировки не установлены по умолчанию в западных версиях, их необходимо добавить в Панель управления -> Региональные настройки, IIRC
  2. Использование версии Delphi не в Юникоде, к сожалению, какой символ может отображаться, зависит от текущей кодовой страницы. Например, если он не является одним из китайских, он не может отображать нужные вам символы. Какие символы отображаются на самом деле, зависит от того, как коды, которые вы используете, отображаются в текущей кодовой странице. Вы можете использовать многоязычную версию Windows, чтобы полностью перейти на нужный вам язык, или использовать версию Delphi для Unicode (начиная с 2009 года).
0 голосов
/ 11 января 2011

Китайский рынок требует поддержки многобайтовых наборов символов (либо WideChar, либо Unicode).
Delphi 2007 RTL / VCL поддерживает только однобайтовые наборы символов (поддержка WideChar в RTL и VCL очень ограничена).

Самым простым для вас является обновление до версии Delphi, поддерживающей Unicode (Delphi 2009 была первой версией, поддерживающей Unicode, текущая версия Delphi - Delphi XE).

Или вам нужно будет обновить все ваши компоненты для поддержки WideChar и переписать части RTL / VCL, для которых вам нужна поддержка WideChar.

- Йерун

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...