Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Cодержит строка Unicod'овый текст


Автор: Delphist 18.9.2007, 12:09
Подскажите, пожалуйста, как сделать такую вещь, есть переменная S типа string, нужно сделать следующее:
Проверить содержит ли S unicod'ый текст, если содержит, то необходиом его преобразовать к Ansi. Как это сделать.

Автор: Alexeis 18.9.2007, 14:41
Юникодная строка на конце имеет два нуля а не один. Если буфер фиксированный и лишних нулей в конце нет, то можно по этому принципу. Еще можно по тексту если там приемущественно инглиш, то в юникоде заборчик 0 символ 0 символ 0 символ, еще можно сжать злибом, очевидно степень сжатия юникода будет в 2 раза выше.

Автор: BaD_SeCt0R 18.9.2007, 14:47
Дж. Рихтер
Цитата

Unicode — стандарт, первоначально разработанный Apple и Xerox в 1988 г. В 1991 г. был создан консорциум для совершенствования и внедрения Unicode. В него вошли компании Apple, Compaq, Hewlett-Packard, IBM, Microsoft, Oracle, Silicon Graphics, Sybase, Unisys и Xerox. (Полный список компаний — членов консорциума см. на www.Unicode.org.) Эта группа компаний наблюдает за соблюдением стандарта Unicode, описание которого Вы найдете в книге The Unicode Standard издательства Addison-Wesley (ее электронный вариант можно получить на том же www.Unicode.org). 

Строки в Unicode просты и логичны. Все символы в них представлены 16-битными значениями (по 2 байта на каждый). В них нет особых байтов, указывающих, чем является следующий байт — частью того же символа или новым символом. Это значит, что прохождение по строке реализуется простым увеличением или уменьшением значения указателя. Функции CharNext, CharPrev и IsDBCSLeadByte больше не нужны. 

Так как каждый символ — 16-битное число, Unicode позволяет кодировать 65 536 символов, что более чем достаточно для работы с любым языком. Разительное отличие от 256 знаков, доступных в однобайтовом наборе! 

В настоящее время кодовые позиции1 определены для арабского, китайского, греческого, еврейского, латинского (английского) алфавитов, а также для кириллицы (русского), японской каны, корейского хангыль и некоторых других алфавитов. Кроме того, в набор символов включено большое количество знаков препинания, математических и технических символов, стрелок, диакритических и других знаков. Все вместе они занимают около 35 000 кодовых позиций, оставляя простор для будущих расширений.

Код

var
  s:string;
begin
  //... обработка строки
  if IsTextUnicode(@s, Length(s), nil) then
    WideCharToMultiByte(GetACP,       //кодировка ANSI (можно просто CP_ACP)
                        0,            //флаги
                        PWideChar(s), //сама строка...
                        Length(s),    //...и ее длина
    nil, 0, nil, 0);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)