Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2011, 01:59   #1
Zanooda
 
Регистрация: 20.01.2010
Сообщений: 9
По умолчанию UTF-8 to WINDOWS-1251

Здравствуйте! Надо вот чего...
Есть строка в UTF-8. После перекодировки функцией `UTF8ToString` выползает, естественно, ANSI.
Только хреново как-то выползает. Знаки вопроса высовываются там, где зашкаливает за 255. В аглицкой транскрипции, к примеру.
И приспичило эти знаки вопроса заменить на html-сущности (html-entities).
То есть вместо них вставить штуки типа 〹 (`&` без `amp;`,- тут текст корежится,- амперсанд+решетка+циферки+точка_с_з апятой)
Однако, никак не получается вынуть код символа в исходной строке нормально. Кракозубрины выходят, хоть в затылке не чеши.
Как получить ord(x) для UTF-8?
Заранее признателен.
Zanooda вне форума Ответить с цитированием
Старый 19.07.2011, 02:27   #2
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Код:
Utf8ToAnsi(текст)
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 19.07.2011, 02:48   #3
Zanooda
 
Регистрация: 20.01.2010
Сообщений: 9
По умолчанию

[ b ] [ б ] Одиночные звуки
[ d ] [ д ] [ Λ ] [ а ] — короткое
[ f ] [ ф ] [ a:] [ а ] — глубокое
[ 3 ] [ ж ] [ i ] [ и ] — короткое
[ d3 ] [ дж ] [ i: ] [ и ] — долгое
[ g ] [ г ] [ o ]1 [ о ] — короткое
[ h ] [ х ] [ o: ] [ о ] — глубокое
[ k ] [ к ] [ u ] [ у ] — короткое
[ l ] [ л ] [ u: ] [ у ] — долгое
[ m ] [ м ] [ e ] как в слове "плед"
[ n ] [ н ] [ ε: ] как в слове "мёд"
[ p ] [ п ] Дифтонги2
[ s ] [ с ] [ əu ]3 [ оу ]
[ t ] [ т ] [ au ] [ ау ]
[ v ] [ в ] [ ei ] [ эй ]
[ z ] [ з ] [ oi ] [ ой ]
[ t∫] [ ч ] [ ai ] [ ай ]
[∫] [ ш ]
[ r ] Мягкое [ р ] как в слове русский
[ о Знак мягкости как в русской букве Ё (ёлка)
Звуки без аналогий в русском языке
[ θ ] [ æ ]
[ ð ]
[ ŋ ] Носовой, на французский манер, звук [ n ] [ ə ]4 [нейтральный звук]
[ w ]

-------------------------------------------------------
æ,ð,∫ и иже с такими же - надо заменить на коды. (&#12345

Utf8ToAnsi - всё из той же оперы, не работает...

Последний раз редактировалось Zanooda; 19.07.2011 в 02:51.
Zanooda вне форума Ответить с цитированием
Старый 19.07.2011, 02:59   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

MultiByteToWideChar()
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.07.2011, 07:57   #5
Zanooda
 
Регистрация: 20.01.2010
Сообщений: 9
По умолчанию

Спасибо, чтение пошло на пользу, но тараканы не выводятся по-прежнему.
Вываливаю конкретнее - мож, доразмыслит кто-нибудь...

Код:
function MyUTF8ToString(source : string; use_entities : boolean = true) : string;
var
  i : integer;
  Stream : TStringStream;
  ansi_string : ansistring;
  _ord : integer;
begin
  if not use_entities then
    Result := System.UTF8ToString(source)
  else
  begin
    ansi_string := System.UTF8ToString(source);
    Stream := TStringStream.Create;
    try
      for i := 1 to Length(ansi_string) do
      begin
        if (ansi_string[i] = '?') then
        begin
          // Вот этот-то ёordё и надо.
          // Только с ним чего-то необходимо вытворить:
          // сдвинуть, ксорнуть, сэндить, орнуть, засолить, прокипятить...
          _ord := ord(source[i]);//??????????????????????????????????????????????????
          Stream_Write(Stream, '&#' + IntToStr(_ord) + ';');
        end
        else
        begin
          Stream_Write(Stream, ansi_string[i]);
        end;
      end;
      Stream.Seek(0, soBeginning);
      Result := Stream_Read(Stream, 0, Stream.Size);
    finally
      Stream.Free;
    end;
  end;
end;
Zanooda вне форума Ответить с цитированием
Старый 19.07.2011, 09:06   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Бррр....

Код:
ansi_string := System.UTF8ToString(source);
Ну и как же вы полагаете будут сохраняться в подобном коде не-ANSI символы?

В сообщении вам указали переводить UTF8 в Unicode-строку (WideString) и с ней уже работать. Когда все символы замените на их escape-варианты - строку можно будет конвертнуть в ANSI уже без потерь информации.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.07.2011, 09:07   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Версия Delphi, кстати, какая?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.07.2011, 21:03   #8
Zanooda
 
Регистрация: 20.01.2010
Сообщений: 9
По умолчанию

Delphi - XE.
AnsiString потому, что после Delphi 7 всё корёжится и приходится
изобретать подобное:

Код:
function Stream_Write(AStream : TStream; S : string) : int64; inline;
var
  Temp : ansistring;
begin
  Temp := ansistring(S);
  Result := AStream.Write(Pointer(Temp)^, Length(Temp));
end;
---------------------------

А сдвиги и `маринования`... Это вот тут:
http://php.net/manual/en/function.ord.php

---
А именно:

Код:
function ordUTF8($c, $index = 0, &$bytes = null)
{
  $len = strlen($c);
  $bytes = 0;

  if ($index >= $len)
    return false;

  $h = ord($c{$index});

  if ($h <= 0x7F) {
    $bytes = 1;
    return $h;
  }
  else if ($h < 0xC2)
    return false;
  else if ($h <= 0xDF && $index < $len - 1) {
    $bytes = 2;
    return ($h & 0x1F) <<  6 | (ord($c{$index + 1}) & 0x3F);
  }
  else if ($h <= 0xEF && $index < $len - 2) {
    $bytes = 3;
    return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6
                             | (ord($c{$index + 2}) & 0x3F);
  }          
  else if ($h <= 0xF4 && $index < $len - 3) {
    $bytes = 4;
    return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12
                             | (ord($c{$index + 2}) & 0x3F) << 6
                             | (ord($c{$index + 3}) & 0x3F);
  }
  else
    return false;
}
...
Zanooda вне форума Ответить с цитированием
Старый 19.07.2011, 21:07   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Zanooda Посмотреть сообщение
Delphi - XE.
AnsiString потому, что после Delphi 7 всё корёжится и приходится
изобретать подобное
5 баллов, чего уж там.

Результат UTF8ToString сохраняй в String - вот и не будет у тебя никаких потерь символов.

При условии, конечно, что у тебя действительно нормальный UTF8. В чём я сейчас очень сильно сомневаюсь:

Код:
source : string // <- WTF?!

UTF8ToString(source);
Топик - хороший пример, как НЕ НАДО делать. Программировать надо осознанно, а не методом тыка.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.07.2011, 08:13   #10
Zanooda
 
Регистрация: 20.01.2010
Сообщений: 9
По умолчанию

Методом тыка Америку открыли. А без неё какая скукатища по Земле расплескалась бы...
В общем, вот, кому интересно, ещё по теме:
http://habrahabr.ru/blogs/javascript/118973/
...
А строка у меня, действительно, не совсем utf-8, наверное.
Спасибо.
Zanooda вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
utf-8 -> windows-1251 Lihosvet Visual C++ 10 03.09.2022 16:37
php перекодировка из utf-8 в windows-1251 world12_tk PHP 3 25.04.2010 22:55
UTF-8 в Windows-1251 - нужна функция motorway PHP 3 04.07.2009 15:28
Wordpress. Поменять кодировку utf-8 на windows 1251 GarantR Фриланс 4 08.02.2009 12:09