- Заметки Лёвика
- web программирование, администрирование и всякая всячина, которая может оказаться полезной
- PHP iconv — кодировка из utf-8 windows-1251
- Если не работает iconv
- iconv array для массива
- Комментарии (3) к записи “PHP iconv — кодировка из utf-8 windows-1251”
- Как перекодировать Windows-1252 в UTF-8?
- 3 ответа 3
- mb_convert_encoding
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Смотрите также
- User Contributed Notes 32 notes
- Технарь
- Блог о программировании и околопрограммерских штуках.
- Конвертация строки из utf-8 в win-1251 на PHP
- Конвертация строки из utf-8 в win-1251 на PHP : 5 комментариев
Заметки Лёвика
web программирование, администрирование и всякая всячина, которая может оказаться полезной
PHP iconv — кодировка из utf-8 windows-1251
При помощи функции php iconv (строго говоря, это не совсем функция PHP, она использует стороннюю библиотеку (есть iconv.dll и php_iconv.dll или iconv.so), которой может не быть на хостинге) легко преобразовать кодировку (например, из windows-1251 в utf-8 и наоборот:
$s = iconv( «cp1251″,»UTF-8», $s);
$s = iconv(«UTF-8», «windows-1251», $s);
Однако, если не работает iconv на хостинге, а преобразовать текст из одной кодировки в другую необходимо, можно воспользоваться сторонними функциями (на самом деле, встречал несколько вариантов — какой из них лучше.. или точнее “более рабочий” — не скажу).
Про преобразование UFT-8 сущностей я уже писал ранее , однако иногда требуется наоборот перевести текст из cp1251 в utf-8 — например.
Если не работает iconv
function iconv ($in_charset, $out_charset, $str) string — для преобразования из Windows в UTF-8 выполняем один из вызовов
iconv( «cp1251″,»UTF-8», $s);
iconv( «windows-1251″,»UTF-8», $s);
выдаёт пустую строку (если в $s нет английских символов — они в любой кодировке отображаются одинаково) на некоторых хостингах можно попробовать использовать функцию mb_convert_encoding — у неё другой порядок аргументов!
function mb_convert_encoding ($str, $to_encoding, $from_encoding = null) string
Т.е. чтобы преобразовать текст из кодировки windows-1251 в UTF-8 следует выполнить:
mb_convert_encoding($s,»UTF-8″,»windows-1251″);
iconv array для массива
В некоторых ситуациях преобразовать одномерный или многомерный массив из одной кодировки в другую (например, из utf8 в windows-1251) с сохранением ключей массива. Для решения, можно использовать несколько способов.
// если не требуется сохранять предыдущий массив, для экономии
// передаем его по ссылке, происходит замена внутри
function utf8to1251(&$text) <
$text = iconv(«utf-8», «windows-1251», $text); //without return
>
array_walk_recursive($array, «utf8to1251»);
Или, если требуется оставить исходный массив без изменений — можно воспользоваться:
$newArray = array_map(create_function(‘$v’, ‘return iconv(«utf-8», «windows-1251», $v);’), $oldArray);
Метки: iconv
Опубликовано Пятница, Октябрь 21, 2011 в 15:02 в следующих категориях: Без рубрики. Вы можете подписаться на комментарии к этому сообщению через RSS 2.0. Вы можете оставить комментарий. Пинг отключен.
Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)
html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)
ссылка (для отправки по почте)
Комментарии (3) к записи “PHP iconv — кодировка из utf-8 windows-1251”
Как быть с запросом select к базе mssql не понимает кирилицу
“select
[Название]
,[номер]
, [Removed]
from imdb.dbo. Оконечное оборудование “;
Следует привести столбцы (или всю базу данных сразу) к соответствующему сравнению (кодировке)
ALTER DATABASE COLLATE Cyrillic_General_CI_AS
Или использовать Nvarchar
declare @test TABLE
(
Col1 varchar(40),
Col2 varchar(40),
Col3 nvarchar(40),
Col4 nvarchar(40)
)
INSERT INTO @test VALUES
(‘иытание’,N’иытание’,’иытание’,N’иытание’)
SELECT * FROM @test
В старом скрипте на php 5.3 работает
function conv($text) <
return iconv(’UTF-8′, ‘WINDOWS-1251′, $text);
>
Если изменяю версию php 5.6 то не перекодируется. Не подскажете?
Как перекодировать Windows-1252 в UTF-8?
Спарсил один заказ, записываю в базу. Если записывать в базу как есть, то в базе будет: Оформлен
Пробовал переводить этот текст в декодере выводит: CP1252 → UTF-8 = Оформлен
В базу русский текст не записывается(нужно слово «Оформлен»), а пишутся каракули.
1) Пробую перекодировать:
Результат тот же. Вычитал в еще такой способ:
2) Пробую по-другому:
Результат: Îôîðìëåí Смотрю что это за кодировка, результат:
То есть кодировка не меняется? Как сменить кодировку?
3 ответа 3
Это обычная 1251 а не 1252 — очень часто все эти автоматические распознавалки путают эти две кодировки, при этом реально 1252 встречается намного реже.
Ваш вопрос нужно поделить на два вопроса. Сначала верно переконвертировать текст в правильную кодировку (iconv — правильное решение, вы сами написали); второе — верно вставить в базу данных. Вот тут уже нужно смотреть кодировку подключения/базы/сервера и может быть много ньюансов. Ведь вы же везде пишете «база», «в базу», верно?
Сначала посмотрите, чтобы выводилось правильно на страницу (файл, отладчик). Не забывайте, что страница с исходным кодом тоже может кодировку не uft-8, а cp1251. И при выводе на страницу важны заголовки, отдаваемые сервером и прописанные в хедерах.
Потом проверьте настройки подключения к базе. Иногда бывает можно set names utf8 поставить, если лень разбираться в вопросах кодировок.
mb_convert_encoding
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_convert_encoding — Преобразует кодировку символов
Описание
Преобразует символы string в кодировку to_encoding . Также можно указать необязательный параметр from_encoding . Если string является массивом ( array ), все его строковые ( string ) значения будут преобразованы рекурсивно.
Список параметров
Строка ( string ) или массив ( array ), для преобразования.
Кодировка, в которую будут преобразованы данные из string .
Параметр для указания исходной кодировки строки. Это может быть массив ( array ), или строка со списком кодировок через запятую. Если параметр from_encoding не указан, то кодировка определяется автоматически.
Возвращаемые значения
Преобразованная строка ( string ) или массив ( array ), или false в случае возникновения ошибки.
Список изменений
8.0.0 | Теперь from_encoding может быть null . |
---|---|
Версия | Описание |
7.2.0 | Функция теперь также принимает массив ( array ) в string . Ранее поддерживались только строки ( string ). |
Примеры
Пример #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() — Установка/получение списка кодировок для механизмов определения кодировки
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
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
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
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
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 );
>
Технарь
Блог о программировании и околопрограммерских штуках.
Конвертация строки из utf-8 в win-1251 на PHP
Для конвертации на php строки из utf-8 в windows-1251 и наоборот, можно использовать следующую функцию:
если необходимо обратное действие, то:
Описание функции iconv:
string iconv ( string from_kodirovka, string to_kodirovka, string str )
Производит преобразование кодировки символов строки str из начальной кодировки from_kodirovka в конечную to_kodirovka. Возвращает строку в новой кодировке, или FALSE в случае ошибки.
Если добавить //TRANSLIT к параметру out_charset будет включена транслитеризация. Это означает, что вслучае, когда символа нет в конечной кодировке, он заменяется одним или несколькими аналогами. Если добавить //IGNORE, то символы, которых нет в конечной кодировке, будут опущены. Иначе, будет возвращена строка str, обрезанная до первого недопустимого символа.
В случае, если ваш хостинг не поддерживает iconv, для конвертации из utf-8 в win-1251 и наоборот можно использовать следующие функции:
Конвертация строки из utf-8 в win-1251 на PHP : 5 комментариев
Ой, большое спасибо! Были большие проблемы с кодировками при использовании аякса, с Вашей функцией все встало нормально
ну просто восхитительные функции — поставил и забыл про конвертацию)
почему-то после конвертации из utf8 в win1251 вместо букв вопросительные знаки:
.
а у меня не работает 🙁
ругается на вот эту строку:
for($i = 0, $l = strlen($s); $i
Нужно заменить эту 6-ую строку на:
for($i = 0, $l = strlen($s); $i