Меню Рубрики

Mb detect encoding windows 1251

Mb detect encoding windows 1251

Администратор

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

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

1. Почему не mb_detect_encoding() ?

Если кратко — он не работает.

// На входе — русский текст в кодировке CP1251
$string = iconv(‘UTF-8’, ‘Windows-1251’, ‘Он подошел к Анне Павловне, поцеловал ее руку, подставив ей свою надушенную и сияющую лысину, и покойно уселся на диване.’);

// Посмотрим, что нам выдает md_detect_encoding(). Сначала $strict = FALSE
var_dump(mb_detect_encoding($string, array(‘UTF-8’)));
// UTF-8
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘Windows-1251’)));
// Windows-1251
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘KOI8-R’)));
// KOI8-R
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘Windows-1251’, ‘KOI8-R’)));
// FALSE
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘ISO-8859-5’)));
// ISO-8859-5
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘Windows-1251’, ‘KOI8-R’, ‘ISO-8859-5’)));
// ISO-8859-5

// Теперь $strict = TRUE

var_dump(mb_detect_encoding($string, array(‘UTF-8’), TRUE));
// FALSE
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘Windows-1251’), TRUE));
// FALSE
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘KOI8-R’), TRUE));
// FALSE
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘Windows-1251’, ‘KOI8-R’), TRUE));
// FALSE
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘ISO-8859-5’), TRUE));
// ISO-8859-5
var_dump(mb_detect_encoding($string, array(‘UTF-8’, ‘Windows-1251’, ‘KOI8-R’, ‘ISO-8859-5’), TRUE));
// ISO-8859-5

Как видим, на выходе — полная каша. Что мы делаем, когда непонятно почему так себя ведет функция? Правильно, гуглим. Нашел замечательный ответ.

Чтобы окончательно развеять все надежды на использование mb_detect_encoding(), надо залезть в исходники расширения mbstring. Итак, закасали рукава, поехали:

// ext/mbstring/mbstring.c:2629
PHP_FUNCTION(mb_detect_encoding)
<
.
// строка 2703
ret = mbfl_identify_encoding_name(&string, elist, size, strict);
.

// ext/mbstring/libmbfl/mbfl/mbfilter.c:643
const char*
mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict)
<
const mbfl_encoding *encoding;

encoding = mbfl_identify_encoding(string, elist, elistsz, strict);
.

// ext/mbstring/libmbfl/mbfl/mbfilter.c:557
/*
* identify encoding
*/
const mbfl_encoding *
mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict)
<
.

Постить полный текст метода не буду, чтобы не засорять статью лишними исходниками. Кому это интересно посмотрят сами. Нас истересует строка под номером 593, где собственно и происходит проверка того, подходит ли символ под кодировку:

// ext/mbstring/libmbfl/mbfl/mbfilter.c:593
(*filter->filter_function)(*p, filter);
if (filter->flag) <
bad++;
>

Вот основные фильтры для однобайтовой кириллицы:

Windows-1251 (оригинальные комментарии сохранены)

// ext/mbstring/libmbfl/filters/mbfilter_cp1251.c:142
/* all of this is so ugly now! */
static int mbfl_filt_ident_cp1251(int c, mbfl_identify_filter *filter)
<
if (c >= 0x80 && c flag = 0;
else
filter->flag = 1; /* not it */
return c;
>

// ext/mbstring/libmbfl/filters/mbfilter_koi8r.c:142
static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter)
<
if (c >= 0x80 && c flag = 0;
else
filter->flag = 1; /* not it */
return c;
>

ISO-8859-5 (тут вообще все весело)

// ext/mbstring/libmbfl/mbfl/mbfl_ident.c:248
int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter)
<
return c;
>

Как видим, ISO-8859-5 всегда возвращает TRUE (чтобы вернуть FALSE, нужно выставить filter->flag = 1).

Когда посмотрели фильтры, все встало на свои места. CP1251 от KOI8-R не отличить никак. ISO-8859-5 вообще если есть в списке кодировок — будет всегда детектиться как верная.

В общем, fail. Оно и понятно — только по кодам символов нельзя в общем случае узнать кодировку, так как эти коды пересекаются в разных кодировках.

А гугл выдает всякие убожества. Даже не буду постить сюда исходники, сами посмотрите, если захотите (уберите пробел после http://, не знаю я как показать текст не ссылкой):

Минусы и плюсы в комменте по ссылке. Лично я считаю, что только для детекта кодировки это решение избыточно — слишком мощно получается. Определение кодировки в нем — как побочный эффект ).

4. Собственно, мое решение

Идея возникла во время просмотра второй ссылки из прошлого раздела. Идея следующая: берем большой русский текст, замеряем частоты разных букв, по этим частотам детектим кодировку. Забегая вперед, сразу скажу — будут проблемы с большими и маленькими буквами. Поэтому выкладываю примеры частот букв (назовем это — «спектр») как с учетом регистра, так и без (во втором случае к маленькой букве добавлял еще большую с такой же частотой, а большие все удалял). В этих «спектрах» вырезаны все буквы, имеющие частоты меньше 0,001 и пробел. Вот, что у меня получилось после обработки «Войны и Мира»:

array (
‘о’ => 0.095249209893009,
‘е’ => 0.06836817536026,
‘а’ => 0.067481298384992,
‘и’ => 0.055995027400041,
‘н’ => 0.052242744063325,
.
‘э’ => 0.002252892226507,
‘Н’ => 0.0021318391371162,
‘П’ => 0.0018574762967903,
‘ф’ => 0.0015961610948418,
‘В’ => 0.0014044332975731,
‘О’ => 0.0013188987793209,
‘А’ => 0.0012623590130186,
‘К’ => 0.0011804488387602,
‘М’ => 0.001061932790165,
)

array (
‘О’ => 0.095249209893009,
‘о’ => 0.095249209893009,
‘Е’ => 0.06836817536026,
‘е’ => 0.06836817536026,
‘А’ => 0.067481298384992,
‘а’ => 0.067481298384992,
‘И’ => 0.055995027400041,
‘и’ => 0.055995027400041,
.
‘Ц’ => 0.0029893589260344,
‘ц’ => 0.0029893589260344,
‘щ’ => 0.0024649163501406,
‘Щ’ => 0.0024649163501406,
‘Э’ => 0.002252892226507,
‘э’ => 0.002252892226507,
‘Ф’ => 0.0015961610948418,
‘ф’ => 0.0015961610948418,
)

Спектры в разных кодировках (ключи массива — коды соответствующих символов в соответствующей кодировке):

Далее. Берем текст неизвестной кодировки, для каждой проверяемой кодировки находим частоту текущего символа и прибавляем к «рейтингу» этой кодировки. Кодировка с бОльшим рейтингом и есть, скорее всего, кодировка текста.

$encodings = array(
‘cp1251’ => require ‘specter_cp1251.php’,
‘koi8r’ => require ‘specter_koi8r.php’,
‘iso88595’ => require ‘specter_iso88595.php’
);
$enc_rates = array();
for ($i = 0; $i $char_specter)
<
$enc_rates[$encoding] += $char_specter[ord($str[$i])];
>
>
var_dump($enc_rates);

Даже не пытайтесь выполнить этот код у себя — он не заработает. Можете считать это псевдокодом — я опустил детали, чтобы не загромождать статью. $char_specter — это как раз те массивы, на которые стоят ссылки на pastebin.

Строки таблицы — кодировка текста, столбцы — содержимое массива $enc_rates.

1) $str = ‘Русский текст’;

cp1251 | koi8r | iso88595 |

0.441 | 0.020 | 0.085 | Windows-1251

0.049 | 0.441 | 0.166 | KOI8-R

0.133 | 0.092 | 0.441 | ISO-8859-5

Все отлично. Реальная кодировка имеет уже в 4 раза бОльший рейтинг, чем остальные — это на таком коротком тексте. На более длинных текстах соотношение будет примерно таким же.

2) $str = ‘ СТРОКА КАПСОМ РУССКИЙ ТЕКСТ’;

cp1251 | koi8r | iso88595 |

0.013 | 0.705 | 0.331 | Windows-1251

0.649 | 0.013 | 0.201 | KOI8-R

0.007 | 0.392 | 0.013 | ISO-8859-5

У-упс! Полная каша. А потому что большие буквы в CP1251 обычно соответствуют маленьким в KOI8-R. А маленькие буквы используются в свою очередь намного чаще, чем большие. Вот и определяем строку капсом в CP1251 как KOI8-R.

Пробуем делать без учета регистра («спектры» case insensitive)

1) $str = ‘Русский текст’;

cp1251 | koi8r | iso88595 |

0.477 | 0.342 | 0.085 | Windows-1251

0.315 | 0.477 | 0.207 | KOI8-R

0.216 | 0.321 | 0.477 | ISO-8859-5

2) $str = ‘ СТРОКА КАПСОМ РУССКИЙ ТЕКСТ’;

cp1251 | koi8r | iso88595 |

1.074 | 0.705 | 0.465 | Windows-1251

0.649 | 1.074 | 0.201 | KOI8-R

0.331 | 0.392 | 1.074 | ISO-8859-5

Как видим, верная кодировка стабильно лидирует и с регистрозависимыми «спектрами» (если строка содержит небольшое количество заглавных букв), и с регистронезависимыми. Во втором случае, с регистронезависимыми, лидирует не так уверенно, конечно, но вполне стабильно даже на маленьких строках. Можно поиграться еще с весами букв — сделать их нелинейными относительно частоты, например.

В топике не расмотрена работа с UTF-8 — тут никакий принципиальной разницы нету, разве что получение кодов символов и разбиение строки на символы будет несколько длиннее/сложнее.

Эти идеи можно распространить не только на кириллические кодировки, конечно — вопрос только в «спектрах» соответствующих языков/кодировок.

Источник

Неверное определение кодировки mb_detect_encoding

Необходимо выбрать содержимое тега title. Обрабатываю с помощью DOM парсера. Когда сохраняю у себя и открываю в редакторе содержимое тега title отображается нормально — кириллица. На php-странице и при сохранении в БД выглядит так — ÐаÑалог книг онлайн â ÑиÑайÑе онлайн и ÑкаÑивайÑе беÑплаÑно ÑедевÑÑ ÑÑÑÑкой клаÑÑиÑеÑкой лиÑеÑаÑÑÑÑ.

Получаю содержимое страницы. Определяю кодировку функцией mb_detect_encoding — выводит «UTF-8». Однако декодер студии Лебедева (https://www.artlebedev.ru/decoder/advanced/) определяет ее как ISO-8859-1.

Перекодирую из ISO-8859-1 в UTF-8 — получаю еще один вид «крокозябов» — ÃÂðÃÂðûþó úýøó þýûðùý â ÃÂøÃÂðùÃÂõ þýûðùý ø ÃÂúðÃÂøòðùÃÂõ ñõÃÂÿûðÃÂýþ ÃÂõôõòÃÂàÃÂÃÂÃÂÃÂúþù úûðÃÂÃÂøÃÂõÃÂúþù ûøÃÂõÃÂðÃÂÃÂÃÂÃÂ.

Почему функция PHP возвращает одну кодировку, а скрипт Лебедева — другую (причем нормально форматирует в кириллицу)?

Как мне в данном случае преобразовать этот текст к кириллице?

2 ответа 2

В этой функции нет какой-то магии, которая позволит для заданного куска бинарника угадать кодировку текста. Ключевое слово «угадать». Что такое кодировка? Таблица соответствия байт и отображаемых символов. Если у вас есть только бинарная строка байт — этого недостаточно чтобы узнать как это отображать. Для большинства кодировок мира определено значение для любого возможного байта (собственно потому столь много кодировок некогда и появилось, что многобайтовые кодировки было дорого, а однобайтовые — мало). Если для всех байтов есть значения — то и отобразить можем в любой из этих кодировок. Можно только попробовать угадать что из этого пользователь сочтёт имеющим смысл.

Необходимо выбрать содержимое тега title

Ищите кодировку в HTTP-ответе сервера и в meta-тегах. Хотя особое счастье если они различаются. Сейчас с этим заметно проще чем 15-20 лет назад, можно рассчитывать что в HTTP заголовках кодировка указана и указана корректно.

Источник

mb_convert_encoding

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

mb_convert_encoding — Преобразует кодировку символов

Описание

Преобразует символы val в кодировку to_encoding . Также можно указать необязательный параметр from_encoding . Если val является массивом ( array ), все его строковые ( string ) значения будут преобразованы рекурсивно.

Список параметров

Строка ( string ) или массив ( array ), для преобразования.

Кодировка, в которую будут преобразованы данные из val .

Параметр для указания исходной кодировки строки. Это может быть массив ( array ), или строка со списком кодировок через запятую. Если параметр from_encoding не указан, то кодировка определяется автоматически.

Возвращаемые значения

Преобразованная строка ( string ) или массив ( array ).

Примеры

Пример #1 Пример использования mb_convert_encoding()

/* Преобразует строку в кодировку SJIS */
$str = mb_convert_encoding ( $str , «SJIS» );

/* Преобразует из EUC-JP в UTF-7 */
$str = mb_convert_encoding ( $str , «UTF-7» , «EUC-JP» );

/* Автоматически определяется кодировка среди JIS, eucjp-win, sjis-win, затем преобразуется в UCS-2LE */
$str = mb_convert_encoding ( $str , «UCS-2LE» , «JIS, eucjp-win, sjis-win» );

/* «auto» используется для обозначения «ASCII,JIS,UTF-8,EUC-JP,SJIS» */
$str = mb_convert_encoding ( $str , «EUC-JP» , «auto» );
?>

Смотрите также

  • mb_detect_order() — Установка/получение списка кодировок для механизмов определения кодировки

Список изменений

Версия Описание
7.2.0 Функция теперь также принимает массив ( array ) в val . Ранее поддерживались только строки ( string ).

User Contributed Notes 32 notes

For my last project I needed to convert several CSV files from Windows-1250 to UTF-8, and after several days of searching around I found a function that is partially solved my problem, but it still has not transformed all the characters. So I made ​​this:

function w1250_to_utf8($text) <
// map based on:
// http://konfiguracja.c0.pl/iso02vscp1250en.html
// http://konfiguracja.c0.pl/webpl/index_en.html#examp
// http://www.htmlentities.com/html/entities/
$map = array(
chr(0x8A) => chr(0xA9),
chr(0x8C) => chr(0xA6),
chr(0x8D) => chr(0xAB),
chr(0x8E) => chr(0xAE),
chr(0x8F) => chr(0xAC),
chr(0x9C) => chr(0xB6),
chr(0x9D) => chr(0xBB),
chr(0xA1) => chr(0xB7),
chr(0xA5) => chr(0xA1),
chr(0xBC) => chr(0xA5),
chr(0x9F) => chr(0xBC),
chr(0xB9) => chr(0xB1),
chr(0x9A) => chr(0xB9),
chr(0xBE) => chr(0xB5),
chr(0x9E) => chr(0xBE),
chr(0x80) => ‘€’,
chr(0x82) => ‘‚’,
chr(0x84) => ‘„’,
chr(0x85) => ‘…’,
chr(0x86) => ‘†’,
chr(0x87) => ‘‡’,
chr(0x89) => ‘‰’,
chr(0x8B) => ‘‹’,
chr(0x91) => ‘‘’,
chr(0x92) => ‘’’,
chr(0x93) => ‘“’,
chr(0x94) => ‘”’,
chr(0x95) => ‘•’,
chr(0x96) => ‘–’,
chr(0x97) => ‘—’,
chr(0x99) => ‘™’,
chr(0x9B) => ‘’’,
chr(0xA6) => ‘¦’,
chr(0xA9) => ‘©’,
chr(0xAB) => ‘«’,
chr(0xAE) => ‘®’,
chr(0xB1) => ‘±’,
chr(0xB5) => ‘µ’,
chr(0xB6) => ‘¶’,
chr(0xB7) => ‘·’,
chr(0xBB) => ‘»’,
);
return html_entity_decode(mb_convert_encoding(strtr($text, $map), ‘UTF-8’, ‘ISO-8859-2’), ENT_QUOTES, ‘UTF-8’);
>

I’ve been trying to find the charset of a norwegian (with a lot of ø, æ, å) txt file written on a Mac, i’ve found it in this way:

= «A strange string to pass, maybe with some ø, æ, å characters.» ;

foreach( mb_list_encodings () as $chr ) <
echo mb_convert_encoding ( $text , ‘UTF-8’ , $chr ). » : » . $chr . «
» ;
>
?>

The line that looks good, gives you the encoding it was written in.

Hope can help someone

many people below talk about using
( $s , ‘HTML-ENTITIES’ , ‘UTF-8’ );
?>
to convert non-ascii code into html-readable stuff. Due to my webserver being out of my control, I was unable to set the database character set, and whenever PHP made a copy of my $s variable that it had pulled out of the database, it would convert it to nasty latin1 automatically and not leave it in it’s beautiful UTF-8 glory.

So [insert korean characters here] turned into .

I found myself needing to pass by reference (which of course is deprecated/nonexistent in recent versions of PHP)
so instead of
(& $s , ‘HTML-ENTITIES’ , ‘UTF-8’ );
?>
which worked perfectly until I upgraded, so I had to use
( ‘mb_convert_encoding’ , array(& $s , ‘HTML-ENTITIES’ , ‘UTF-8’ ));
?>

Hope it helps someone else out

Hey guys. For everybody who’s looking for a function that is converting an iso-string to utf8 or an utf8-string to iso, here’s your solution:

public function encodeToUtf8($string) <
return mb_convert_encoding($string, «UTF-8», mb_detect_encoding($string, «UTF-8, ISO-8859-1, ISO-8859-15», true));
>

public function encodeToIso($string) <
return mb_convert_encoding($string, «ISO-8859-1», mb_detect_encoding($string, «UTF-8, ISO-8859-1, ISO-8859-15», true));
>

For me these functions are working fine. Give it a try

aaron, to discard unsupported characters instead of printing a ?, you might as well simply set the configuration directive:

in your php.ini. Be sure to include the quotes around none. Or at run-time with

My solution below was slightly incorrect, so here is the correct version (I posted at the end of a long day, never a good idea!)

Again, this is a quick and dirty solution to stop mb_convert_encoding from filling your string with question marks whenever it encounters an illegal character for the target encoding.

function convert_to ( $source , $target_encoding )
<
// detect the character encoding of the incoming file
$encoding = mb_detect_encoding ( $source , «auto» );

// escape all of the question marks so we can remove artifacts from
// the unicode conversion process
$target = str_replace ( «?» , «[question_mark]» , $source );

// convert the string to the target encoding
$target = mb_convert_encoding ( $target , $target_encoding , $encoding );

// remove any question marks that have been introduced because of illegal characters
$target = str_replace ( «?» , «» , $target );

// replace the token string «[question_mark]» with the symbol «?»
$target = str_replace ( «[question_mark]» , «?» , $target );

return $target ;
>
?>

Hope this helps someone! (Admins should feel free to delete my previous, incorrect, post for clarity)
-A

For those wanting to convert from $set to MacRoman, use iconv():

= iconv ( ‘UTF-8’ , ‘macintosh’ , $string );

?>

(‘macintosh’ is the IANA name for the MacRoman character set.)

instead of ini_set(), you can try this

// convert UTF8 to DOS = CP850
//
// $utf8_text=UTF8-Formatted text;
// $dos=CP850-Formatted text;

$dos = mb_convert_encoding($utf8_text, «CP850», mb_detect_encoding($utf8_text, «UTF-8, CP850, ISO-8859-15», true));

If you are trying to generate a CSV (with extended chars) to be opened at Exel for Mac, the only that worked for me was:
( $CSV , ‘Windows-1252’ , ‘UTF-8’ ); ?>

I also tried this:

//Separado OK, chars MAL
iconv ( ‘MACINTOSH’ , ‘UTF8’ , $CSV );
//Separado MAL, chars OK
chr ( 255 ). chr ( 254 ). mb_convert_encoding ( $CSV , ‘UCS-2LE’ , ‘UTF-8’ );
?>

But the first one didn’t show extended chars correctly, and the second one, did’t separe fields correctly

Why did you use the php html encode functions? mbstring has it’s own Encoding which is (as far as I tested it) much more usefull:

$text = mb_convert_encoding($text, ‘HTML-ENTITIES’, «UTF-8»);

To add to the Flash conversion comment below, here’s how I convert back from what I’ve stored in a database after converting from Flash HTML text field output, in order to load it back into a Flash HTML text field:

function htmltoflash($htmlstr)
<
return str_replace(«
«,»\n»,
str_replace(» «,»>»,
mb_convert_encoding(html_entity_decode($htmlstr),
«UTF-8″,»ISO-8859-1»))));
>

Another sample of recoding without MultiByte enabling.
(Russian koi->win, if input in win-encoding already, function recode() returns unchanged string)

// 0 — win
// 1 — koi
function detect_encoding ( $str ) <
$win = 0 ;
$koi = 0 ;

if( $win $koi ) <
return 1 ;
> else return 0 ;

// recodes koi to win
function koi_to_win ( $string ) <

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

$end = strlen ( $string );
$pos = 0 ;
do <
$c = ord ( $string [ $pos ]);
if ( $c > 128 ) <
$string [ $pos ] = chr ( $kw [ $c — 128 ]);
>

function recode ( $str ) <

$enc = detect_encoding ( $str );
if ( $enc == 1 ) <
$str = koi_to_win ( $str );
>

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Mb convert encoding windows 1251 utf 8
  • Mb 508 драйвер windows 7
  • Mayvio budget для windows
  • Maxxaudio windows 10 dell
  • Maxthon для windows xp 32 bit