Как преобразовать символы Юникода в коды ASCII в Delphi 7?
Вопрос
Да, мы говорим о кодах ASCII.Мои извинения, я здесь не разработчик Delphi.
Решение
Для Delphi 7 я получил бы бесплатную библиотеку Юникода от Майк Лишке , который является автором Virtual Treeview.
Библиотека содержит множество функций преобразования для перехода в Unicode и обратно, поэтому вы можете использовать те из них, которые наиболее целесообразны в вашем приложении.
Или вы можете перейти на Delphi 2009 со встроенными процедурами кодирования и собственной библиотекой функций преобразования.
Другие советы
Давайте сделаем несколько вещей прямо. Набор символов (кодировка) и кодировки символов - это две взаимосвязанные, но разные концепции. Набор символов - это абстрактный список символов с каким-либо целочисленным кодом. Затем идут кодировки символов, которые в основном представляют собой алгоритм, который описывает, как символы представлены в байтах.
ASCII выполняет функции как набора символов, так и кодировки. Он использует 7 бит для выражения 128 символов (94 для печати). Unicode , с другой стороны, представляет собой набор символов, выражающий 1114,112 кодовых точек. Существует несколько кодировок для представления строк в Юникоде, но наиболее заметными являются UTF-8, UTF-16, UTF-16LE и UTF-32. Другими словами, один символ Unicode может быть представлен по-разному в зависимости от кодировки.
Как я могу преобразовать символы юникода в коды ascii в Delphi 7?
Я думаю, что вопрос можно интерпретировать двумя способами.
<Ол>У меня есть строка Unicode в некоторой кодировке, которая включает только печатные символы ASCII. Как я могу преобразовать строку в байтовый массив кодировки ASCII?
У меня есть строка Unicode в некоторых кодировках, которая также включает не-ASCII печатные символы, такие как китайские символы. Как я могу закодировать строку в кодировку ASCII без потери информации, а затем декодировать ее обратно в исходную строку Юникода?
Если вы имеете в виду первое, вы можете загрузить строку Unicode в WideString, как говорит Осман, и выполнить
var
original: WideString;
s: AnsiString;
begin
s := AnsiString(original);
Если вы имеете в виду второе, вам понадобится универсальный алгоритм кодирования, например Base64 . Вы можете использовать DCPBase64.pas , включенный в состав Дэвида Бартона <
Это зависит от вашего определения конверсии. Если вы хотите отобразить 127 младших символов в эквивалент Unicode, вы можете использовать явное приведение. Но это создает мусор, если строка содержит более высокие символы.
Если вы хотите сопоставления типа ë - > е и û - > Вы можете написать свой собственный код. Но помните, что всегда есть символы, которые нельзя преобразовать.
«ASCII» — это название конкретного сопоставления символов с числами, но некоторые люди говорят «код ASCII», хотя на самом деле они вообще не имеют в виду ASCII;им просто нужно числовое значение символа, какое бы сопоставление ни действовало в данный момент.Применимо ли это описание к вам?
Если да, то вы можете использовать Ord
стандартную функцию для получения значения кодовой точки Юникода для любого имеющегося у вас символа Юникода.
var
wc: WideChar;
ws: WideString;
x: Word;
x := Ord(wc);
x := Ord(ws[1]);
Однако если вы действительно имели в виду ASCII, вам придется более конкретно указать, какой тип преобразования вы имеете в виду.
Например, буква A представлена в Юникоде как U+0041, а в ANSI — как просто 41.Преобразование будет довольно простым, но вам нужно выяснить, как кодируется символ Юникода.Наиболее распространенными являются UTF-16 и UTF-8.UTF 16 — это, по сути, два байта на символ, но даже это является чрезмерным упрощением, поскольку символ может иметь больше байтов.UTF-8 звучит так, как будто это означает 1 байт на символ, но может быть 2 или 3.Еще больше усложняет ситуацию то, что UTF-16 может быть с прямым порядком байтов или с прямым порядком байтов.(U+0041 или U+4100).
Ваш вопрос не имеет смысла, если вы хотите, например, преобразовать арабскую букву ain U+0639 в ansi в английском языке.Вы не можете.
См. соответствующие вопросы по преобразованию из Unicode в ASCII:
- Как преобразовать UTF-8 в US-Ascii в Java
- Как преобразовать символ Юникода в его эквивалент ASCII
- Как преобразовать формат файла из Unicode в ASCII с помощью Python?
В общем, набор символов из сотен тысяч записей не может быть преобразован в набор символов из 127 записей без некоторой потери информации или схемы кодирования.
Вы можете использовать эту функцию в http://swissdelphicenter.ch/en/showcode .php? id = 1692
Он преобразует строку Unicode в строку Ansi, используя указанную кодовую страницу.
Если вы хотите конвертировать, используя системную кодовую страницу по умолчанию (определенную в региональных параметрах как кодировка не-юникод), вы можете сделать это просто следующим образом:
var
ws: widestring;
s: string;
begin
s:=string(ws)