Delphi 2006 переводит с/на французский/голландский/немецкий языки с помощью одной кодовой страницы ansi

Мне нужно сделать несколько переводов с/на французский/голландский/немецкий языки с использованием Delphi 2006 (без каких-либо сторонних модулей/компонентов).

Эти 3 языка имеют кодовую страницу 1252. Наша база данных совместима с UTF-8, поэтому на данный момент я полагаюсь на то, что все значения из таблиц имеют UTF-8. Должен ли я быть уверен в этом предположении? Это будет работать хорошо, или мне следует беспокоиться о различиях UTF-8 -> кодовая страница 1252, если они есть? Я не понял разницы между UTF-8 и кодовыми страницами (например я понял, что первые 127 байт одинаковые, а начиная с 128 байта разные).

Во-вторых, мне нужно сделать поиск по некоторым полям. Могу ли я полагаться на функцию ANSIUpperCase из D2006? Или я должен сделать пользовательскую функцию для обработки каждого специального символа?

LE: данные хранятся в формате UTF-8.

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


person RBA    schedule 30.11.2011    source источник
comment
Я хотел бы, чтобы ваш вопрос был лучше, если бы вы задавали один вопрос на вопрос. Это кажется бесполезным всему миру, кроме вас, потому что вы объединили в один вопрос столько не связанных между собой вещей. Все выиграют, если вы разбиваете свои вопросы. Кроме того, поскольку ваша БД уже UTF8, мне интересно, почему вы продолжаете использовать версию ANSI delphi? XE/XE2 — это естественное обновление. Просто мысль.   -  person Warren P    schedule 01.12.2011


Ответы (1)


  1. База данных, совместимая с UTF8, не означает, что данные фактически хранятся в UTF8. Например. в Firebird (который совместим с UTF8) вы можете объявлять таблицы, используя наборы символов ANSI.
  2. Вам нужно будет преобразовать UTF8 в ANSI 1252 и наоборот. Например. с подпрограммами UTF8Encode и UTF8Decode.
person Ondrej Kelle    schedule 30.11.2011
comment
Я уточню вопрос. Данные хранятся в кодировке UTF-8. - person RBA; 30.11.2011
comment
и после того, как я расшифрую UTF-8, AnsiUpperCase даст мне хороший результат? или я должен лечить строку? - person RBA; 30.11.2011
comment
Да, после преобразования в ANSI вы можете нормально использовать строковые функции ANSI. Не забудьте преобразовать результаты обратно в UTF8 для публикации в базе данных. - person Ondrej Kelle; 30.11.2011
comment
Обратите внимание, что UTF8Encode() ожидает WideString на входе, а UTF8Decode() возвращает WideString на выходе. Так что на самом деле вам нужно перейти от UTF8->UTF16->ANSI при чтении данных и от ANSI->UTF16->UTF8 при записи данных. Вы должны быть ОЧЕНЬ осторожны с преобразованиями UTF16->ANSI и ANSI->UTF16, в частности. Если вы должны использовать кодовую страницу 1252 специально, используйте ее явно в коде, вызвав MultiByteToWideChar() и WideCharToMultiByte() напрямую. Не полагайтесь на то, что RTL всегда использует CP1252 на всех машинах. - person Remy Lebeau; 02.12.2011