This page has been robot translated, sorry for typos if any. Original content here.

Фукнции перекодування UTF8-Win, Win-UTF8

Іноді трапляються такі моменти, коли в php потрібно перекодувати дані з одного кодування в іншу.

У даній статті опишемо кілька функцій, які я сам не раз використовував.

Функції та скрипти написані не мною, але успішно працюють і часто допомагають при php-javascript взаємодіях.

Отже, перекодування з utf-8 в windows-1251 і назад:

Функція перша з utf8 в cp1251

 function utf8_win1 ($ s) {
 $ S = strtr ($ s, array ( "\ xD0 \ xB0" => "а", "\ xD0 \ x90" => "А", "\ xD0 \ xB1" => "б", "\ xD0 \ x91 "=>" Б ",
  "\ XD0 \ xB2" => "в", "\ xD0 \ x92" => "У", "\ xD0 \ xB3" => "г", "\ xD0 \ x93" => "Г", "\ xD0 \ xB4 "=>" д ",
  "\ XD0 \ x94" => "Д", "\ xD0 \ xB5" => "е", "\ xD0 \ x95" => "Е", "\ xD1 \ x91" => "е", "\ xD0 \ x81 "=>" Е ",
  "\ XD0 \ xB6" => "ж", "\ xD0 \ x96" => "Ж", "\ xD0 \ xB7" => "з", "\ xD0 \ x97" => "З", "\ xD0 \ xB8 "=>" і ",
  "\ XD0 \ x98" => "І", "\ xD0 \ xB9" => "й", "\ xD0 \ x99" => "Й", "\ xD0 \ xBA" => "до", "\ xD0 \ x9A "=>" К ",
  "\ XD0 \ xBB" => "л", "\ xD0 \ x9B" => "Л", "\ xD0 \ xBC" => "м", "\ xD0 \ x9C" => "М", "\ xD0 \ xBD "=>" н ",
  "\ XD0 \ x9D" => "Н", "\ xD0 \ xBE" => "о", "\ xD0 \ x9E" => "Про", "\ xD0 \ xBF" => "п", "\ xD0 \ x9F "=>" П ",
  "\ XD1 \ x80" => "р", "\ xD0 \ xA0" => "Р", "\ xD1 \ x81" => "з", "\ xD0 \ xA1" => "С", "\ xD1 \ x82 "=>" т ",
  "\ XD0 \ xA2" => "Т", "\ xD1 \ x83" => "у", "\ xD0 \ xA3" => "У", "\ xD1 \ x84" => "ф", "\ xD0 \ xA4 "=>" Ф ",
  "\ XD1 \ x85" => "х", "\ xD0 \ xA5" => "Х", "\ xD1 \ x86" => "ц", "\ xD0 \ xA6" => "Ц", "\ xD1 \ x87 "=>" ч ",
  "\ XD0 \ xA7" => "Ч", "\ xD1 \ x88" => "ш", "\ xD0 \ xA8" => "Ш", "\ xD1 \ x89" => "щ", "\ xD0 \ xA9 "=>" Щ ",
  "\ XD1 \ x8A" => "ь", "\ xD0 \ xAA" => "Комерсант", "\ xD1 \ x8B" => "и", "\ xD0 \ xAB" => "И", "\ xD1 \ x8C "=>" ь ",
  "\ XD0 \ xAC" => "Ь", "\ xD1 \ x8D" => "е", "\ xD0 \ xAD" => "Е", "\ xD1 \ x8E" => "ю", "\ xD0 \ xAE "=>" Ю ",
  "\ XD1 \ x8F" => "я", "\ xD0 \ xAF" => "Я"));
 return $ s;
 }

Функція друга з utf8 в cp1251

 function utf8_win ($ s) {$ out = "";  $ C1 = "";  $ Byte2 = false;  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;  } 

Функція перша з windows-1251 в utf-8

  function win_utf8 ($ in_text) { 
  $ Output = "";
  $ Other [1025] = "Е";
  $ Other [1105] = "е";
  $ Other [1028] = "Є";
  $ Other [1108] = "є";
  $ Other [1030] = "I";
  $ Other [1110] = "i";
  $ Other [тисяча тридцять один] = "Ї";
  $ Other [1111] = "ї";
  for ($ i = 0; $ i <strlen ($ in_text); $ i ++) {
  if (ord ($ in_text {$ i})> 191) {
  $ Output. = "& #". (Ord ($ in_text {$ i}) + 848). ";";
  } Else {
  if (array_search ($ in_text {$ i}, $ other) === false) {
  $ Output. = $ In_text {$ i};
  } Else {
  $ Output. = "& #". Array_search ($ in_text {$ i}, $ other). ";";
  }
  }
  }
  return $ output;
 }

Функція перекодування з windows-1251 в utf-8

Раніше користувався iconv ( "CP1251 ?," UTF-8 ?, $ text_for_convert), але, як відомо iconv дає велике навантаження на сервер і працює повільніше ніж представлена нижче функція.

Відмовитися від iconv змусило ще те, що в певний момент при перекодуванні з windows-1251 в UTF-8 без видимих ​​причин, дана функція стала повертати порожній рядок.

!!! Якщо поміняти місцями $ in_arr і $ out_arr, то функція запрацює "в зворотному напрямку", тобто перетворюватиме UTF-8 в CP-1251.

 function cp1251_to_utf8 ($ txt) {
  $ In_arr = array (
  chr (208), chr (192), chr (193), chr (194),
  chr (195), chr (196), chr (197), chr (168),
  chr (198), chr (199), chr (200), chr (201),
  chr (202), chr (203), chr (204), chr (205),
  chr (206), chr (207), chr (209), chr (210),
  chr (211), chr (212), chr (213), chr (214),
  chr (215), chr (216), chr (217), chr (218),
  chr (219), chr (220), chr (221), chr (222),
  chr (223), chr (224), chr (225), chr (226),
  chr (227), chr (228), chr (229), chr (184),
  chr (230), chr (231), chr (232), chr (233),
  chr (234), chr (235), chr (236), chr (237),
  chr (238), chr (239), chr (240), chr (241),
  chr (242), chr (243), chr (244), chr (245),
  chr (246), chr (247), chr (248), chr (249),
  chr (250), chr (251), chr (252), chr (253),
  chr (254), chr (255)
  ); 
 
  $ Out_arr = array (
  chr (208) .chr (160), chr (208) .chr (144), chr (208) .chr (145),
  chr (208) .chr (146), chr (208) .chr (147), chr (208) .chr (148),
  chr (208) .chr (149), chr (208) .chr (129), chr (208) .chr (150),
  chr (208) .chr (151), chr (208) .chr (152), chr (208) .chr (153),
  chr (208) .chr (154), chr (208) .chr (155), chr (208) .chr (156),
  chr (208) .chr (157), chr (208) .chr (158), chr (208) .chr (159),
  chr (208) .chr (161), chr (208) .chr (162), chr (208) .chr (163),
  chr (208) .chr (164), chr (208) .chr (165), chr (208) .chr (166),
  chr (208) .chr (167), chr (208) .chr (168), chr (208) .chr (169),
  chr (208) .chr (170), chr (208) .chr (171), chr (208) .chr (172),
  chr (208) .chr (173), chr (208) .chr (174), chr (208) .chr (175),
  chr (208) .chr (176), chr (208) .chr (177), chr (208) .chr (178),
  chr (208) .chr (179), chr (208) .chr (180), chr (208) .chr (181),
  chr (209) .chr (145), chr (208) .chr (182), chr (208) .chr (183),
  chr (208) .chr (184), chr (208) .chr (185), chr (208) .chr (186),
  chr (208) .chr (187), chr (208) .chr (188), chr (208) .chr (189),
  chr (208) .chr (190), chr (208) .chr (191), chr (209) .chr (128),
  chr (209) .chr (129), chr (209) .chr (130), chr (209) .chr (131),
  chr (209) .chr (132), chr (209) .chr (133), chr (209) .chr (134),
  chr (209) .chr (135), chr (209) .chr (136), chr (209) .chr (137),
  chr (209) .chr (138), chr (209) .chr (139), chr (209) .chr (140),
  chr (209) .chr (141), chr (209) .chr (142), chr (209) .chr (143)
  ); 
 
  $ Txt = str_replace ($ in_arr, $ out_arr, $ txt);
  return $ txt;
 }