8 заметок с тегом

utf8 РСС

5 июня 2012, 14:01

UTF Code points to UTF8

html_entity_decode(preg_replace("/\\\\u([0-9a-fA-F]+)/", "&#x$1;", json_encode($array)), ENT_COMPAT, 'UTF-8');
code points   php   utf8

29 апреля 2011, 14:58

PHP: detect UTF8 :D

function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);

}
php   utf8

6 апреля 2011, 11:17

MySQL: utf8_unicode_ci и utf8_general_ci

Увидел в проекте странный коллейшон у базы utf8_unicode_ci. Решил почитать что за зверь, и нашёл на сайте мускула простой ответ:
For any Unicode character set, operations performed using the _general_ci collation are faster than those for the _unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages “ß” is equal to “ss”. utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.
Дам вольный перевод:
Для всех юникодовых кодировок операции сравнения происходят быстрее с _general_ci (на 30%), но они менее правильные чем с _unicode_ci (ещё генерал_си не чувствительна к регистру). _unicode_ci поддерживает отображения, в виде разложения, то есть для одного символа “ß” одной языковой группы может соответствовать пара других символов “ss” другой языковой группы. _general_ci есть наследственным коллейшеном, что не поддерживает расширений, сокращений или игнорируемых символов.


То есть желательно от неё избавиться, хотя могут возникнуть некоторые проблемы с поиском и тегами :)
utf8   charset

28 февраля 2011, 17:01

php   utf8

15 января 2010, 18:25

HTML CharCodes for special symbols (Spanish, Italian, German, French)

Есть проекты разны-вкусны, делаешь его на англицком и руссише, а тут клиент бац и говорит что нужно ещё пару-тройку европеских ленгвиджей, а CMSка то windows1251 и точить ой как лень под UTF8 всё и везде. Вместо желанных умляутов, клиент в лучшем случаи увидит букву без точек, запятых, а что ещё хуже знаки вопроса.

Простой выход помахать дороговизной переработки, и объяснить то-сё, а можно просто сделать через ВИЗИВИГ реплейсы непонятных символов в альтернативные спецсимволы, а в простых инпутах заставить вставлять вместо тех символов спец-коды.

Пример таблички (бабосики):
Display Friendly Code Numerical Code Hex Code Description
€ € € Euro
₣ ₣ Franc
₧ ₧ Peseta
₤ Lira





html   utf8

4 сентября 2009, 15:01

PHP: utf8 to cp1251

Используя коды наших символов в утф8 и цп1251, находим последовательность операций для их превращения, и в итоге мы получаем небольшую функцию
function utf8_to_cp1251($s){
    for ($c=0;$c<strlen($s);$c++){
       $i=ord($s[$c]);
       if ($i<=127) $out.=$s[$c];
           if ($byte2){
               $new_c2=($c1&3)*64+($i&63);
               $new_c1=($c1>>2)&5;
               $new_i=$new_c1*256+$new_c2;
           if ($new_i==1025){
               $out_i=168;
           } else {
               if ($new_i==1105){
                   $out_i=184;
               } else {
                   $out_i=$new_i-848;
               }
           }
           $out.=chr($out_i);
           $byte2=false;
           }
       if (($i>>5)==6) {
           $c1=$i;
           $byte2=true;
       }
    }
    return $out;
}

2 августа 2009, 15:42

MySQL convert All tables (encoding, alter)

Иногда нужно поменять кодировку БД (появился новый язык, и нужен утф8 срочно, или поменялась ЦМС, или власть сменилась).
Хм, у нас для этого есть стандартные команды:
ALTER TABLE sometable CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
ALTER TABLE sometable DEFAULT CHARACTER SET cp1251;
# another way
ALTER TABLE articles CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE articles DEFAULT CHARACTER SET utf8
Казалось бы, всё просто ;) Но а если таблиц 100, 200, 300 о_О это что по одной колбасить? :D
Не смешно :( но выход есть, всё теми же стандартными фишками ;)
# мы возьмём и используем ИнфоСхему ;)
use information_schema;
# Запихаем все таблички базы someDB в МЕМ
select TABLE_SCHEMA, TABLE_NAME from TABLES where TABLE_SCHEMA = "someDB";
# Нарисуем команды
select 
	CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` 
		CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
		Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` 
		DEFAULT CHARACTER SET cp1251;") 
	as MySQLCMD from TABLES where TABLE_SCHEMA = "someDB";
# Думаете всё? Магия произошла? нееет!
# Теперь смотрим в аутпут, копируем все команды, 
# и выполняем огромный запрос.
# Для удобства советую phpMyAdmin

ЗЫ: все таблички то в нужной кодировочке, а база то нет ;) не забываем
ALTER DATABASE `someDB` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
cp1251   charset   utf8

12 марта 2009, 5:08

Избранное

utf8   cp1251