Я запускаю устаревшее приложение, построенное на Delphi2007, где мы использовали для обработки неанглийских символов, сохраняя 2-байтовый шестнадцатеричный код символа в БД. Во время чтения мы применяем char() для преобразования этого шестнадцатеричного кода в строку.
Преобразование строки в шестнадцатеричный формат (перед сохранением в БД):
strHex := Format( '%x', [ Byte( strText[ lIndex ] ) shr 4 ] );
DataStr[ lPos ] := strHex[ 1 ];
inc( lPos );
strHex := Format( '%x', [ Byte( strText[ lIndex ] ) and $0F ] );
DataStr[ lPos ] := strHex[ 1 ];
inc( lPos );
//in simple I am saving the Hex code to pcData
Hex в строку (после чтения из БД):
strText := strText + Chr( StrToInt('$'+ DataStr[lPos] + DataStr[lPos + 1]))
Этот код начал ломаться после перехода на Delphi XE7, где string обрабатывается как UniCode String, мы явно должны преобразовать строку в тип AnsiString.
Преобразование приведенной ниже строки в шестнадцатеричный
ТуцЕфылАшдеук8311
В Delphi 2007 дает:
\D2\F3\F6\C5\F4\FB\EB\C0\F8\E4 \E5\F3\EA8311
В Delphi XE7 выдает:
\22\43\46\1A\33\4B\4B\48\44\42\14\44\49 \33\351522
Я хотел бы знать, как лучше всего изменить этот код, чтобы я мог обрабатывать свои устаревшие данные.
AnsiString
этого типа и использовать его при извлечении данных из вашей базы данных. Я настоятельно рекомендую вам немедленно преобразовать его в обычный (юникод)string
при использовании его в вашем приложении, преобразовав обратно только для хранения в БД. А еще лучше, обновите свою БД до юникода и вообще избавьтесь от этого бардака. См.: stackoverflow.com/a/7222871/327083. - person J...   schedule 04.02.2016