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

UFT8 и PHP

Казалось бы, как только начинаешь использовать мультибайт, тебя спасут теже функции, только с mb_ в начале, оказалось показалось %).
В них желательно не забывать указывать какую именно кодировку вы используете
mb_substr($var,0,99,'utf-8')
Что-то типа такого, и да, мануалы в помощь.

Для почитать на досуге, советую:



PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
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

Конвертация кириличной строки (Cyrillic UTF8) в транслит Избранное

Это обновлённый вариант
function Transliterate($string){
  $cyr=array(
     "Щ", "Ш", "Ч","Ц", "Ю", "Я", "Ж","А","Б","В",
     "Г","Д","Е","Ё","З","И","Й","К","Л","М","Н",
     "О","П","Р","С","Т","У","Ф","Х","Ь","Ы","Ъ",
     "Э","Є", "Ї","І",
     "щ", "ш", "ч","ц", "ю", "я", "ж","а","б","в",
     "г","д","е","ё","з","и","й","к","л","м","н",
     "о","п","р","с","т","у","ф","х","ь","ы","ъ",
     "э","є", "ї","і"
  );
  $lat=array(
     "Shch","Sh","Ch","C","Yu","Ya","J","A","B","V",
     "G","D","e","e","Z","I","y","K","L","M","N",
     "O","P","R","S","T","U","F","H","", 
     "Y","" ,"E","E","Yi","I",
     "shch","sh","ch","c","Yu","Ya","j","a","b","v",
     "g","d","e","e","z","i","y","k","l","m","n",
     "o","p","r","s","t","u","f","h",
     "", "y","" ,"e","e","yi","i"
  );
  for($i=0; $i<count($cyr); $i++)  {
     $c_cyr = $cyr[$i];
     $c_lat = $lat[$i];
     $string = str_replace($c_cyr, $c_lat, $string);
  }
  $string = 
  	preg_replace(
  		"/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]e/", 
  		"\${1}e", $string);
  $string = 
  	preg_replace(
  		"/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]/", 
  		"\${1}'", $string);
  $string = preg_replace("/([eyuioaEYUIOA]+)[Kk]h/", "\${1}h", $string);
  $string = preg_replace("/^kh/", "h", $string);
  $string = preg_replace("/^Kh/", "H", $string);
  return $string;
}
function encodestring($string){
  $string = 
  	str_replace(array(" ",""","&","<",">"), 
  		array(" "), $string);
  $string = preg_replace("/[_\s\.,?!\[\](){}]+/", "_", $string);
  $string = preg_replace("/-{2,}/", "--", $string);
  $string = preg_replace("/_-+_/", "--", $string);
  $string = preg_replace("/[_\-]+$/", "", $string);
  $string = Transliterate($string);
  $string = ToLower($string);
  $string = preg_replace("/j{2,}/", "j", $string);
  $string = preg_replace("/[^0-9a-z_\-]+/", "", $string);
  return $string;
}

Старый вариант, рабоатет на пхп < 5.1.2
// функция для разложения строки в массив 
// аналог стандартной str_split, но для работы с UTF-8
// проверено на многих языках
function str_split_utf8($str) {
    $split = 1;
    $array = array();
    for ($i=0; $i < strlen($str); ){
        $value = ord($str[$i]);
        if($value > 127){
            if ($value >= 192 && $value <= 223)      $split = 2;
            elseif ($value >= 224 && $value <= 239)  $split = 3;
            elseif ($value >= 240 && $value <= 247)  $split = 4;
        } else $split = 1;
        $key = NULL;
        for ( $j = 0; $j < $split; $j++, $i++ ) $key .= $str[$i];
        array_push( $array, $key );
    }
    return $array;
} 
function encodestring($st)  {
	// Сначала заменяем "односимвольные" фонемы.

	$st_cyr = str_split_utf8("абвгґдеёзиійклмнопрстуфхыэ"+
	"АБВГҐДЕЁЗИІЙКЛМНОПРСТУФХЫЭ ");
	$st_lat = str_split_utf8("abvggdeeziyyklmnoprstufhie"+
	"ABVGGDEEZIYYKLMNOPRSTUFHIE_");
	foreach ($st_lat as $key => $value) {
		$st_lat[$st_cyr[$key]] = $value; 
		unset($st_lat[$key]);
	}
	$st = strtr($st, $st_lat); 
	
	// Далее заменяем "многосивольные" фонемы, и фонемы без аналогов.

	$st_mf = array(
		           "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", 
		           "ш"=>"sh", "щ"=>"shch","ю"=>"yu", 
		           "я"=>"ya", "Ж"=>"ZH", "Ц"=>"TS", 
		           "Ч"=>"CH", "Ш"=>"SH", "Щ"=>"SHCH",
		           "Ю"=>"YU", "Я"=>"YA", "ї"=>"yi", 
		           "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye", 
		           "ь"=>"","ъ"=>"","Ь"=>"","Ъ"=>"");
	$st = strtr($st, $st_mf); 
	
	// Добиваем синтаксический мусор 
	return ereg_replace("[^A-Za-z0-9\.\–\(\)_]", "", $st); 
}
// пример:
echo encodestring("мухаха!@#$%^&*_+!№;%:?*[]{}-=,<>+(ололоЪь).");
// в результате получим:
// muhaha_(ololo).