Текст на русском языке, изначально написанный в 8-битном коде Windows, был перекодирован в 16-битный

Обновлено: 07.07.2024

Эта функция преобразует строку string из кодировки ISO-8859-1 в UTF-8 .

Примечание.

Многие веб-страницы, помеченные как использующие кодировку символов ISO-8859-1, на самом деле используют аналогичную кодировку Windows-1252, и веб-браузеры интерпретируют веб-страницы ISO-8859-1 как Windows-1252. . Windows-1252 содержит дополнительные печатные символы, такие как знак евро (€) и фигурные кавычки ( " "), вместо некоторых управляющих символов ISO-8859-1. Эта функция не будет правильно преобразовывать такие символы Windows-1252. Используйте другую функцию, если требуется преобразование Windows-1252.

Параметры

Строка ISO-8859-1.

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

Возвращает перевод строки в формате UTF-8 .

Журнал изменений

< td>Эта функция была перенесена в ядро ​​PHP, и, следовательно, снимается требование к расширению XML, чтобы эта функция была доступна.
Версия Описание
7.2.0

См. также

  • utf8_decode() – преобразует строку с символами ISO-8859-1, закодированными с помощью UTF-8, в однобайтовые символы ISO-8859-1 – выполняет обратное преобразование.
  • mb_convert_encoding() — преобразование кодировки символов – преобразование между различными кодировками символов, включая UTF-8, ISO-8859-1 и Windows-1252.
  • iconv() – Преобразование строки в запрошенную кодировку – Преобразование между различными кодировками символов.
  • recode_string() — перекодировать строку в соответствии с запросом на перекодирование — конвертирует между различными кодировками символов

Примечания, внесенные пользователями 23 примечания

Обратите внимание, что utf8_encode преобразует только строку, закодированную в ISO-8859-1, в UTF-8. Более подходящим названием для него было бы «iso88591_to_utf8». Если ваш текст не закодирован в ISO-8859-1, вам не нужна эта функция. Если ваш текст уже в UTF-8, вам не нужна эта функция. Фактически, применение этой функции к тексту, который не закодирован в ISO-8859-1, скорее всего, просто исказит этот текст.

Если вам нужно преобразовать текст из любой кодировки в любую другую кодировку, используйте iconv().

Вот код, решающий проблему, описанную Стивеном в предыдущем комментарии.

/* Эта структура кодирует разницу между ISO-8859-1 и Windows-1252,
как сопоставление кодировки UTF-8 некоторых управляющих символов ISO-8859-1 с
UTF -8 кодирование неуправляющих символов, которое Windows-1252 помещает
в эквивалентные кодовые точки. */

$cp1252_map = array(
"\xc2\x80" => "\xe2\x82\xac" , /* ЗНАК ЕВРО */
"\xc2\x82" => "\xe2 \x80\x9a" , /* ОДИНАРНАЯ МАЛАЯ-9 КАВАТЫ */
"\xc2\x83" => "\xc6\x92" , /* СТРОЧНАЯ ЛАТИНСКАЯ БУКВА F С КРЮЧКОМ */
" \xc2\x84" => "\xe2\x80\x9e" , /* ДВОЙНАЯ МАЛАЯ-9 КАВАТЫ */
"\xc2\x85" => "\xe2\x80\xa6" , /* ГОРИЗОНТАЛЬНАЯ ЭЛЛИПСИС */
"\xc2\x86" => "\xe2\x80\xa0" , /* КИНЖАЛ */
"\xc2\x87" => "\xe2\x80\xa1" , /* ДВОЙНОЙ КИНЖАЛ */
"\xc2\x88" => "\xcb\x86" , /* БУКВА-МОДИФИКАТОР АКЦЕНТ CIRCUMFLEX */
"\xc2\x89" => "\xe2\x80 \xb0" , /* ПРОМЫШЛЕННЫЙ ЗНАК */
"\xc2\x8a" => "\xc5\xa0" , /* ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА S С КАРОНОМ */
"\xc2\x8b" => "\xe2\x80\xb9" , /* ОДИНОЧНАЯ ЛЕВАЯ ЦИТАТА */
"\xc2\x8c" => "\xc5\x92" , /* ЛАТИНСКАЯ ЗАГЛАВНАЯ ЛИГАТУРА OE */
"\xc2\x8e" => "\xc5\xbd" , /* ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА Z С КАРОНОМ */
"\xc2\x91" => "\xe2\x80\x98" , /* ЛЕВАЯ ОДИНАРНАЯ КАТЫЧКА */
"\xc2\x92" => "\xe2\x80\x99" , /* ПРАВЫЙ SIN GLE QUOTATION MARK */
"\xc2\x93" => "\xe2\x80\x9c" , /* LEFT DOUBLE QUOTATION MARK */
"\xc2\x94" => "\xe2\ x80\x9d" , /* ПРАВАЯ ДВОЙНАЯ КАВАЧКА */
"\xc2\x95" => "\xe2\x80\xa2" , /* ПУЛЯ */
"\xc2\x96" = > "\xe2\x80\x93" , /* БОЛЬШОЕ ТИРЕ */
"\xc2\x97" => "\xe2\x80\x94" , /* БОЛЬШОЕ ТИРЕ */

"\xc2\x98" => "\xcb\x9c" , /* МАЛАЯ ТИЛЬДА */
"\xc2\x99" => "\xe2\x84\xa2" , /* ЗНАК ТОРГОВОЙ МАРКИ */
"\xc2\x9a" => "\xc5\xa1" , /* СТРОЧНАЯ ЛАТИНСКАЯ БУКВА S С КАРОН */
"\xc2\x9b" => "\xe2\x80\xba " , /* ОДИНАРНАЯ ЦИТАТА С ПРАВЫМ УГЛОМ*/
"\xc2\x9c" => "\xc5\x93" , /* ЛАТИНСКАЯ МАЛАЯ ЛИГАТУРА OE */
"\xc2\x9e" = > "\xc5\xbe" , /* СТРОЧНАЯ ЛАТИНСКАЯ БУКВА Z С КАРОНОМ */
"\xc2\x9f" => "\xc5\xb8" /* ЗАГЛАВНАЯ ЛАТИНСКАЯ БУКВА Y С ДИЭРЕЗИСОМ*/
);

функция cp1252_to_utf8 ( $str ) global $cp1252_map ;
возвратить strtr ( utf8_encode ( $str ), $cp1252_map );
>

Пройтись по вложенным массивам/объектам и закодировать все строки в utf8.

// Использование
class Foo public $somevar = 'whoop whoop' ;
>

$structure = array(
'object' => (object) array(
'entry' => 'hello wörld',
'another_array' => array(
>'string' ,
1234 ,
'другая строка'
)
),
'string' => 'foo' ,
'foo_object' => новый Фу
);

// $structure теперь имеет кодировку utf8
print_r ( $structure );

сбросить($значение);
> else if ( is_object ( $input )) $vars = array_keys ( get_object_vars ( $input ));

foreach ($vars as $var) utf8_encode_deep ($input -> $var);
>
>
>
?>

Если вам нужна функция, которая преобразует массив строк в массив строк в кодировке utf8, эта функция может быть вам полезна:

Моя версия utf8_encode_deep,
Если вам нужна версия, которая возвращает значение без изменения оригинала.

Я много чего перепробовал, но, похоже, это последний способ сохранения при сбое для преобразования любой строки в правильную UTF-8.

функция _convert ( $content ) <
if(! mb_check_encoding ( $content , 'UTF-8' )
ИЛИ !( $content === mb_convert_encoding ( mb_convert_encoding ( $content , 'UTF- 32' , 'UTF-8' ), 'UTF-8' , 'UTF-32' )))

$content = mb_convert_encoding ($content, 'UTF-8');

if ( mb_check_encoding ( $content , 'UTF-8' )) <
// log('Конвертировано в UTF-8');
> else <
// log('Не удалось преобразовать в UTF-8');
>
>
возврат $content ;
>
?>

Для справки, может быть полезно отметить, что:
utf8_encode($s)
фактически идентично:
recode_string('latin1..utf8', $s)< br />и:
icon('iso-8859-1', 'utf-8', $s)
То есть utf8_encode — это особый случай преобразования набора символов.

Если ваша строка, которую нужно преобразовать в utf-8, отличается от iso-8859-1 (например, iso-8859-2 (польский/хорватский)), вы должны использовать recode_string() или iconv() вместо пытаясь разработать сложные операторы str_replace.

Если вы ищете функцию для замены специальных символов значением hex-utf-8 (например, для совместимости с Webservice-Security/WSS4J), вы можете использовать это:

$textstart = "Größe";
$utf8 ='';
$max = strlen($txt);

$utf8 .= $neu;
> // для $i

Но меня это не устраивало, потому что мне нужна была строка в моей кодировке, чтобы сделать некоторые сравнения и другие вещи. Итак, я изменил указанную выше функцию и в сочетании с функцией code2utf(), упомянутой здесь в какой-то другой заметке, мне удалось достичь своей цели:

if ( $iconv_to != "UTF-8" ) $decodedStr = iconv ("UTF-8" , $iconv_to , $decodedStr );
>

$ups = распаковать('C*', $str);
if (!($aCnt = count($ups))) return true; // Пустая строка *является* допустимой UTF-8
for ($i = 1; $i 0 && $i 0x9F) return false;
перерыв;
case 0xF0:
if ($cbyte 0x8F) вернуть false;
перерыв;
по умолчанию:
перерыв;
>
$first = false;
>
$tbytes--;
>
если ($tbytes) вернуть false; // неполная последовательность на EOS
>
return true;
>

Если вы еще не догадались: если символ UTF-8 не представлен в кодовой странице ISO-8859-1, символ ? будет возвращен. Возможно, вы захотите обернуть вокруг этого функцию, чтобы убедиться, что вы не сохраняете кучу файлов . в вашу базу данных.

Эта функция может быть полезна при кодировании ключей и значений массива [и сначала проверяет, не находится ли он уже в формате UTF]:

публичная статическая функция to_utf8 ( $in )
<
if ( is_array ( $in )) <
foreach ( $in as $key => $value ) <
$out [to_utf8 ($key)] = to_utf8 ($value);
>
> elseif( is_string ( $in )) <
if( mb_detect_encoding ( $in ) != "UTF-8" )
return utf8_encode ($in );
иначе
возврат $in ;
> else <
возврат $in ;
>
возврат $out ;
>
?>

Надеюсь, это поможет.

Избегайте использования preg_match для определения необходимости utf8_encode:

= $string_input ; // избегайте разрушения

$rc = ($string == "" ? true : false );
?>

/**
* Кодирует смешанную переменную ISO-8859-1 в UTF-8 (совместимость с PHP 4, PHP 5)
* @parammixed $input Массив, ассоциативный или простой
* @param boolean $encode_keys необязательный
* @return смешанный ($input в кодировке utf-8)
*/

функция utf8_encode_mix ($input, $encode_keys = false)
if( is_array ( $input ))
$result = array();
foreach( $input as $k => $v )
<
$key = ( $encode_keys )? utf8_encode ($k): $k;
$result [$key] = utf8_encode_mix ($v, $encode_keys);
>
>
else
$result = utf8_encode ( $input );
>

Я рекомендую использовать эту альтернативу для каждого языка:

Не забудьте установить для всех своих страниц кодировку "utf-8", иначе просто используйте объекты HTML.

Эту функцию я использую для преобразования тайского шрифта (iso-8859-11) в UTF-8. В моем случае он работает правильно. Пожалуйста, попробуйте использовать эту функцию, если у вас возникли проблемы с преобразованием кодировки iso-8859-11 в UTF-8.

if ( ! ereg("[\241-\377]", $string))
return $string;

$iso8859_11 = array(
"\xa1" => "\xe0\xb8\x81",
"\xa2" => "\xe0\xb8\x82",
"\xa3" => "\xe0\xb8\x83",
"\xa4" => "\xe0\xb8\x84",
"\xa5" => "\xe0\xb8\ x85",
"\xa6" => "\xe0\xb8\x86",
"\xa7" => "\xe0\xb8\x87",
"\xa8" = > "\xe0\xb8\x88",
"\xa9" => "\xe0\xb8\x89",
"\xaa" => "\xe0\xb8\x8a",
"\xab" => "\xe0\xb8\x8b",
"\xac" => "\xe0\xb8\x8c",
"\xad" => "\xe0\ xb8\x8d",
"\xae" => "\xe0\xb8\x8e",
"\xaf" => "\xe0\xb8\x8f",
"\xb0 " => "\xe0\xb8\x90",
"\xb1" => "\xe0\xb8\x91",
"\xb2" => "\xe0\xb8\x92",
"\xb3" => "\xe0\xb8\x93",
"\xb4" => "\xe0\xb8\x94",
"\xb5" => "\ xe0\xb8\x95",
"\xb6" => "\xe0\xb8\x96",
"\xb7" => "\xe0\xb8\x97",
" \xb8" => "\xe0\xb8\x98",
"\xb9" => "\xe0\xb8\x99",
"\xba" => "\xe0\xb8\x9a ",
"\xbb" => "\xe0\xb8\x9b",
"\xbc" => "\xe0\xb8\x9c",
"\xbd" => "\xe0\xb8\x9d",
"\xbe" => "\xe0\xb8\x9e",
"\xbf" => "\xe0\xb8\x9f",
"\xc0" => "\xe0\xb8\xa0",
"\xc1" => "\xe0\xb8\xa1",
"\xc2" => "\xe0\xb8\xa2",
>"\xc3" => "\xe0\xb8\xa3",
"\xc4" => "\xe0\xb8\xa4",
"\xc5" => "\xe0\xb8 \xa5",
"\xc6" => "\xe0\xb8\xa6",
"\xc7" => "\xe0\xb8\xa7",
"\xc8" => "\xe0\xb8\xa8",
"\xc9" => "\xe0\xb8\xa9",
"\xca" => "\xe0\xb8\xaa",< br />"\xcb" => "\xe0\xb8\xab",
"\xcc" => "\xe0\xb8\xac",
"\xcd" => "\xe0 \xb8\xad",
"\xce" => "\xe0\xb8\xae",
"\xcf" => "\xe0\xb8\xaf",
"\ xd0" => "\xe0\xb8\xb0",
"\xd1" => "\xe0\xb8\xb1",
"\xd2" => "\xe0\xb8\xb2" ,
"\xd3" => "\xe0\xb8\xb3",
"\xd4" => "\xe0\xb8\xb4",
"\xd5" => " \xe0\xb8\xb5",
"\xd6" => "\xe0\xb8\xb6",
"\xd7" => "\xe0\xb8\xb7",
"\xd8" => "\xe0\xb8\xb8",
"\xd9" => "\xe0\xb8\xb9",
"\xda" => "\xe0\xb8\ xba",
"\xdf" => "\xe0\xb8\xbf",
"\xe0" => "\xe0\xb9\x80",
"\xe1" = > "\xe0\xb9\x81",
"\xe2" => "\xe0\xb9\x82",
"\xe3" => "\xe0\xb9\x83",
"\xe4" => "\xe0\xb 9\x84",
"\xe5" => "\xe0\xb9\x85",
"\xe6" => "\xe0\xb9\x86",
"\xe7 " => "\xe0\xb9\x87",
"\xe8" => "\xe0\xb9\x88",
"\xe9" => "\xe0\xb9\x89",
"\xea" => "\xe0\xb9\x8a",
"\xeb" => "\xe0\xb9\x8b",
"\xec" => "\ xe0\xb9\x8c",
"\xed" => "\xe0\xb9\x8d",
"\xee" => "\xe0\xb9\x8e",
" \xef" => "\xe0\xb9\x8f",
"\xf0" => "\xe0\xb9\x90",
"\xf1" => "\xe0\xb9\x91 ",
"\xf2" => "\xe0\xb9\x92",
"\xf3" => "\xe0\xb9\x93",
"\xf4" => "\xe0\xb9\x94",
"\xf5" => "\xe0\xb9\x95",
"\xf6" => "\xe0\xb9\x96",
"\xf7" => "\xe0\xb9\x97",
"\xf8" => "\xe0\xb9\x98",
"\xf9" => "\xe0\xb9 \x99",
"\xfa" => "\xe0\xb9\x9a",
"\xfb" => "\xe0\xb9\x9b"
);

$string=strtr($string,$iso8859_11);
вернуть $string;
>



ключи для кода юникода

// нужен этот метатег

// обратите внимание, что шрифт sylfean, по-видимому, входит в стандартную комплектацию Windows XP
// Он поддерживает грузинский язык

Повторите предыдущий пост о преобразовании кода GB2312 в код Unicode, в котором отображается следующая функция:

Я обнаружил, что требуется небольшое изменение в коде для правильной обработки латинских символов, встроенных в середину текста gb2312, например, когда текст включает URL-адрес или адрес электронной почты. Просто поменяйте местами две строки в той части оператора, которая обрабатывает ord vals !>127.

В оригинальной функции отбрасывался первый латинский символ, и она не преобразовывала первый нелатинский символ после латинского текста (все было сдвинуто на один символ слишком далеко вправо). Если поменять местами эти две строки, все будет работать правильно во всех примерах, которые я пробовал.

Кроме того, изменился источник файла gb2312.txt, необходимого для этого. Вы можете найти его в нескольких местах:

/*
Каждая функция, показанная до сих пор, является незавершенной или потребляющей ресурсы. Вот два из них: целочисленная последовательность 2 utf (i3u) и последовательность utf для целого числа (u3i). Ниже приведен фрагмент кода, проверяющий поведение скважин на границах диапазона.

Когда-нибудь они могут быть жестко закодированы в PHP.
*/

function u3i($s,$strict=1) < // возвращает целое число для действительной последовательности UTF-8, NULL для пустой, иначе FALSE
// NOT strict: принимает только биты DATA, присутствующие или отсутствующие; strict: проверка длины и битов
if ($s=='') return NULL;
$l=strlen($s); $o=орд($s);
if ($o 6 && $strict) вернуть false;
if ($strict) for ($i=1;$i 0xbf || ord($s) [" . u3i($o) . "]\n";
>

$utf8Str .= $utf8Substring . $ несущность;
>
else $utf8Str .= $subStr;
>
>

Следующее регулярное выражение Perl проверяет правильность формата строки Unicode UTF-8 (разбивается после каждого символа |, так как длинные строки здесь недопустимы. Перед использованием соедините их в одну строку, без пробелов.):< /p>

Эта функция преобразует строку string из кодировки UTF-8 в кодировку ISO-8859-1 .Недопустимые байты в строке UTF-8 и символы UTF-8, не существующие в ISO-8859-1 (то есть символы выше U+00FF), заменяются на ? .

Примечание.

Многие веб-страницы, помеченные как использующие кодировку символов ISO-8859-1, на самом деле используют аналогичную кодировку Windows-1252, и веб-браузеры интерпретируют веб-страницы ISO-8859-1 как Windows-1252. . Windows-1252 содержит дополнительные печатные символы, такие как знак евро (€) и фигурные кавычки ( " "), вместо некоторых управляющих символов ISO-8859-1. Эта функция не будет правильно преобразовывать такие символы Windows-1252. Используйте другую функцию, если требуется преобразование Windows-1252.

Параметры

Строка в кодировке UTF-8.

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

Возвращает перевод строки в формате ISO-8859-1 .

Журнал изменений

< td>Эта функция была перенесена в ядро ​​PHP, и, следовательно, снимается требование к расширению XML, чтобы эта функция была доступна.
Версия Описание
7.2.0

См. также

  • utf8_encode() — кодирует строку ISO-8859-1 в UTF-8 — выполняет обратное преобразование
  • mb_convert_encoding() — преобразование кодировки символов – преобразование между различными кодировками символов, включая UTF-8, ISO-8859-1 и Windows-1252.
  • iconv() – Преобразование строки в запрошенную кодировку – Преобразование между различными кодировками символов.
  • recode_string() — перекодировать строку в соответствии с запросом на перекодирование — конвертирует между различными кодировками символов

Пользовательские заметки 32 заметки

Если вы хотите извлечь некоторые данные UTF-8 из своей базы данных, вам не нужна utf8_decode().

Просто выполните следующий запрос перед любым SELECT :

$result = mysql_query("УСТАНОВИТЬ ИМЕНА utf8");

ВАЖНО: при преобразовании данных UTF8, содержащих знак EURO, НЕ ИСПОЛЬЗУЙТЕ функцию utf_decode.

utf_decode преобразует данные в кодировку ISO-8859-1. Но кодировка ISO-8859-1 не содержит знака EURO, поэтому знак EURO будет преобразован в знак вопроса '?'

Для правильного преобразования данных UTF8 со знаком EURO необходимо использовать:

icon("UTF-8", "CP1252", $data)

Обратите внимание, что utf8_decode просто преобразует строку, закодированную в UTF-8, в ISO-8859-1. Более подходящим именем для него было бы utf8_to_iso88591. Если ваш текст уже закодирован в ISO-8859-1, вам не нужна эта функция. Если вы не хотите использовать ISO-8859-1, эта функция вам не нужна.

Обратите внимание, что UTF-8 может представлять намного больше символов, чем ISO-8859-1. Попытка преобразовать строку UTF-8, содержащую символы, которые не могут быть представлены в ISO-8859-1, в ISO-8859-1 исказит ваш текст и/или приведет к потере символов. Попытка преобразовать текст, не закодированный в UTF-8, с помощью этой функции, скорее всего, приведет к искажению текста.

Если вам нужно преобразовать какой-либо текст из любой кодировки в любую другую кодировку, вместо этого используйте iconv().

Предпочтительнее использовать это в массиве со встроенной функцией PHP "array_map()", например:
$array = array_map("utf8_decode", $array);

Если у вас не установлено многобайтовое расширение, вот функция для декодирования строк в кодировке UTF-16. Он поддерживает как строки без спецификации, так и строки со спецификацией (порядок байтов с прямым и прямым порядком байтов).

/**
* Декодировать строки в кодировке UTF-16.
*
* Может обрабатывать как данные со спецификацией, так и данные без спецификации.
* Предполагается порядок байтов с обратным порядком байтов, если спецификация недоступна.
*
* @param string $str Данные в кодировке UTF-16 для декодирования.
* @return string Данные в кодировке UTF-8/ISO.
* @access public
* @version 0.1 / 19 января 2005 г.
* @author Rasmus Andersson
* @package Groupies
*/
функция utf16_decode ($str) if(strlen ($str) 2) return $str;
$bom_be = true ;
$c0 = ord ( $str < 0 >);
$c1 = ord ( $str < 1 >);
if( $c0 == 0xfe && $c1 == 0xff ) < $str = substr ( $str , 2 ); >
elseif( $c0 == 0xff && $c1 == 0xfe ) < $str = substr ( $str , 2 ); $bom_be = ложь; >
$len = strlen ( $str );
$newstr = '' ;
for( $i = 0 ; $i $len ; $i += 2 ) if( $bom_be ) < $val = ord ( $str < $i >) 4 ; $val += ord ($str < $i + 1 >); >
else < $val = ord ( $str < $i + 1 >) 4 ; $val += ord ( $str < $i >); >
$newstr .= ( $val == 0x228 ) ? "\n": chr ($val);
>
вернуть $newstr ;
>
?>

Только для польских букв:

функция utf16_2_utf8 ($nowytekst) $nowytekst = str_replace ('%u0104', 'Ą', $nowytekst); //
$nowytekst = str_replace ('%u0106', 'Ć', $nowytekst); //
$nowytekst = str_replace ('%u0118', 'Ę', $nowytekst); //Ę
$nowytekst = str_replace ('%u0141', 'Ł', $nowytekst); //Ł
$nowytekst = str_replace ('%u0143', 'Ń', $nowytekst); //Ń
$nowytekst = str_replace ('%u00D3', 'Ó', $nowytekst); //Ó
$nowytekst = str_replace ('%u015A', 'Ś', $nowytekst); //Ś
$nowytekst = str_replace ('%u0179', 'Ź', $nowytekst); //Ź
$nowytekst = str_replace ('%u017B', 'Ż', $nowytekst); //Ż

$nowytekst = str_replace ('%u0105', '±', $nowytekst); //±
$nowytekst = str_replace ('%u0107', 'ć', $nowytekst); //ć
$nowytekst = str_replace ('%u0119', 'ę', $nowytekst); //ę
$nowytekst = str_replace ('%u0142', 'ł', $nowytekst); //ł
$nowytekst = str_replace ('%u0144', 'ń', $nowytekst); //ń
$nowytekst = str_replace ('%u00F3', 'ó', $nowytekst); //ó
$nowytekst = str_replace ('%u015B', 'ś', $nowytekst); //ś
$nowytekst = str_replace ('%u017A', 'ź', $nowytekst); //ź
$nowytekst = str_replace ('%u017C', 'ż', $nowytekst); //ż
возврат ( $nowytekst );
>
?>

Все идет гладко, но не меняет '%u00D3','Ó' и '%u00F3','ó'. Я понятия не имею, что с этим делать.

Помните! Файл должен быть сохранен в кодировке UTF-8.

функция utf2iso ($tekst)
$nowytekst = str_replace ("%u0104", "\xA1", $tekst); //
$nowytekst = str_replace ("%u0106", "\xC6", $nowytekst); //
$nowytekst = str_replace ("%u0118", "\xCA", $nowytekst); //Ę
$nowytekst = str_replace("%u0141" , "\xA3" , $nowytekst ); //Ł
$nowytekst = str_replace ("%u0143", "\xD1", $nowytekst); //Ń
$nowytekst = str_replace ("%u00D3", "\xD3", $nowytekst); //Ó
$nowytekst = str_replace ("%u015A", "\xA6", $nowytekst); //Ś
$nowytekst = str_replace ("%u0179", "\xAC", $nowytekst); //Ź
$nowytekst = str_replace ("%u017B", "\xAF", $nowytekst); //Ż

$nowytekst = str_replace ("%u0105", "\xB1", $nowytekst); //±
$nowytekst = str_replace ("%u0107", "\xE6", $nowytekst); //ć
$nowytekst = str_replace ("%u0119", "\xEA", $nowytekst); //ę
$nowytekst = str_replace("%u0142" , "\xB3" , $nowytekst ); //ł
$nowytekst = str_replace ("%u0144", "\xF1", $nowytekst); //ń
$nowytekst = str_replace ("%u00D4", "\xF3", $nowytekst); //ó
$nowytekst = str_replace ("%u015B", "\xB6", $nowytekst); //ś
$nowytekst = str_replace ("%u017A", "\xBC", $nowytekst); //ź
$nowytekst = str_replace ("%u017C", "\xBF", $nowytekst); //ż

return ( $nowytekst );
>
?>

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

Помимо примечания yannikh из gmeil dot com, есть еще один способ декодирования строк с нелатинскими символами из консоли unix, например

Мне было недостаточно использования utf8_decode для получения содержимого страницы с другого сайта. Проблема возникает из-за того, что алфавит отличается от стандартной латиницы. Например, некоторые символы (соответствующие HTML-кодам „ и другим) преобразуются в "?" или "xA0" (шестнадцатеричное значение). Вам нужно сделать некоторое преобразование, прежде чем выполнять utf8_decode. И вы не можете заменить просто, что они могут быть частью 2-байтового кода для char (UTF-8 использует 2 байта). Следующее для кириллицы, но для остальных должно быть очень близко.

Обновление ответа от okx dot Oliver Dot Koenig из gmail dot com для PHP 5.6, так как модификатор e/ устарел

// Это, наконец, помогло мне выполнить работу, благодаря Blackbit, пришлось изменить устаревший ereg:
// исходный комментарий: "Squirrelmail содержит в исходниках хорошую функцию для преобразования юникода в сущности:"< /p>

// Это, наконец, помогло мне выполнить работу, благодаря Blackbit, пришлось изменить устаревший ereg:
// исходный комментарий: "Squirrelmail содержит в исходниках хорошую функцию для преобразования юникода в сущности:"< /p>

Помимо примечания Янниха, для преобразования шестнадцатеричной строки utf8

echo utf8_decode ("\x61\xc3\xb6\x61");
// работает как положено

$abc = "61c3b661" ;
$newstr = "" ;
$l = strlen ( $abc );
для ( $i = 0 ; $i $l ; $i += 2 ) $newstr .= "\x" . $abc[$i]. $abc [ $i + 1 ];
>
echo utf8_decode ( $newstr );
// или варианты "\x": "\\x" и т. д. НЕ выводят то, что вы хотите

echo utf8_decode (pack('H*', $abc));
// это выводит правильную строку, как и первая строка.

Squirrelmail содержит в исходниках замечательную функцию для преобразования юникода в сущности:

= "Åäö" ;
echo iconv ("UTF-8", "ISO-8859-1", $myUnicodeString);
?>

Выше выводилась бы данная переменная в кодировке ISO-8859-1, вы можете заменить ее на любую другую.

Еще одно решение проблемы неправильно отображаемых глифов — просто отправить документ в кодировке UTF-8 и, конечно же, отправить данные в кодировке UTF-8:

Если вы используете Gentoo Linux и столкнулись с проблемами в некоторых приложениях PHP4, говорящих:
Вызов неопределенной функции: utf8_decode()
Попробуйте повторно загрузить PHP4 с включенным флагом 'expat'.

Я заметил, что приведенные ниже функции преобразования utf-8 в html предназначены только для кодов длиной 2 байта. Ну, я хотел поддержку 3 байта (извините, не сделал 4, 5 или 6). Также я заметил, что конкатенация кодов символов имеет шестнадцатеричный префикс 0x и поэтому не работает с большими 2-байтовыми кодами)

Я только что создал этот фрагмент кода, чтобы улучшить настраиваемые пользователем электронные письма, отправляемые одним из моих веб-сайтов.

Цель заключалась в том, чтобы использовать UTF-8 (Unicode), чтобы пользователи, не владеющие английским языком, могли пользоваться всеми преимуществами Unicode, НО также упростить жизнь для англоязычных пользователей (или, в частности, для англоязычных пользователей MS-Outlook). Недостаток: Outlook до 2003 года (?) неправильно определяет электронные письма в формате Unicode. Когда «умные кавычки» из MS Word были вставлены в область форматированного текста и сохранены в Unicode, а затем отправлены по электронной почте пользователю Outlook, чаще всего эти символы ошибочно отображались как «греческие».

Вот краткое изложение результатов:

201 строка является допустимой строкой UTF8 с использованием регулярного выражения phpnote
203 строки является допустимой строкой UTF8 с использованием регулярного выражения j.dittmer
200 строк является допустимой строкой UTF8 с использованием регулярного выражения fhoech
239 строк является допустимой строкой UTF8 используя использование mb_detect_encoding

Вот строки с различиями (слева направо, phpnote, j.dittmer и fhoech):

Интересно, что вы сказали, что ваше регулярное выражение исправляет регулярное выражение j.dittmer, которое не удалось в разделе 5.3, но в моем тесте у меня противоположный результат?!

Я провел этот тест на Windows XP с PHP 4.3.11dev. Возможно, эти различия связаны с операционной системой или версией PHP.

Для mb_detect_encoding я использовал команду:

mb_detect_encoding($line, 'UTF-8, ISO-8859-1, ASCII');

Следующий код помог мне со смешанными кодировками (UTF8+ISO-8859-1(x)). В этом случае у меня есть файлы шаблонов, созданные и поддерживаемые дизайнерами, которые не заботятся о кодировке и данных MySQL в таблицах с кодировкой utf8_binary_ci.

Вспомогательная функция класса
функция strSplit ( $text , $split = 1 )
if (! is_string ( $ text )) return false ;
if (! is_numeric ($split) && $split 1) вернуть false;

$len = strlen ( $text );

в то время как ( $i $len )
$key = NULL ;

for ( $j = 0 ; $j $split ; $j += 1 )
$key .= $text < $i >;

$replace = массив();
$replace [] = 'Помощник::_UTF8ToHTML("\\1")' ;
$replace [] = "ä" ;
$replace [] = "ö" ;
$replace [] = "ü" ;
$replace [] = "Ä" ;
$replace [] = "Ö" ;
$replace [] = "ü" ;
$replace [] = "ß" ;

$str = preg_replace ($search, $replace, $str);

функция _UTF8ToHTML ($str)
$ret = 0;

$tpl = file_get_contents ("template.tpl");
/* . */
$row = mysql_fetch_assoc ($result);

print( Helper :: UTF8ToHTML ( str_replace ("" , $row [ 'var' ], $tpl )));

ЭЙ! ошибка не в функции 'utf8_decode'. Ошибка в функции 'mb_detect_encoding'. Если вы поместите слово со специальным символом в конце, например, «accentué», это приведет к неправильному результату (UTF-8), но если вы поместите в конце еще один символ, например, «accentuée», вы получите правильный результат. Поэтому вы всегда должны добавлять в строку символ ISO-8859-1 для этой проверки. Я советую использовать пустое пространство.
Я пробовал, и это работает!

функция ISO_convert($array)
$array_temp = array();

foreach($array as $name => $value)
if(is_array($value))
$array_temp[(mb_detect_encoding($name." ",'UTF-8,ISO- 8859-1') == 'UTF-8' utf8_decode($name): $name )] = ISO_convert($value);
else
$array_temp[(mb_detect_encoding($name." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($name) : $name ) ] = (mb_detect_encoding($value." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($value) : $value );
>

простое преобразование UTF-8 в HTML:

функция utf8_to_html ($data)
return preg_replace("/([\\xC0-\\xF7][\\x80-\\xBF]+)/e", '_utf8_to_html("\\1 ")', $данные);
>

В регулярном выражении в последнем комментарии есть опечатки. Это
синтаксически верное выражение, но я не уверен, что оно правильное.
Вы должны объединить выражение в одну длинную строку.

Если вы точно не знаете, сколько раз кодируется ваша строка, вы можете использовать эту функцию:

функция _utf8_decode ($string)
$tmp = $string;
$count = 0 ;
в то время как ( mb_detect_encoding ( $ tmp ) == "UTF-8" )
$ tmp = utf8_decode ( $ tmp );
$count++;
>

for ( $i = 0 ; $i $count - 1 ; $i ++)
$string = utf8_decode ( $string );

небольшое обновление для польского декодирования:

функция utf82iso88592($text) $text = str_replace("\xC4\x85", '±', $text);
$text = str_replace("\xC4\x84", 'Ą', $text);
$text = str_replace("\xC4\x87", 'ć', $text);
$text = str_replace("\xC4\x86", 'Ć', $text);
$text = str_replace("\xC4\x99", 'ę', $text);
$text = str_replace("\xC4\x98", 'Ę', $text);
$text = str_replace("\xC5\x82", 'ł', $text);
$text = str_replace("\xC5\x81", 'Ł', $text);
$text = str_replace("\xC3\xB3", 'ó', $text);
$text = str_replace("\xC3\x93", 'Ó', $text);
$text = str_replace("\xC5\x9B", 'ś', $text);
$text = str_replace("\xC5\x9A", 'Ś', $text);
$text = str_replace("\xC5\xBC", 'ż', $text);
$text = str_replace("\xC5\xBB", 'Ż', $text);
$text = str_replace("\xC5\xBA", 'ż', $text);
$text = str_replace("\xC5\xB9", 'Ż', $text);
$text = str_replace("\xc5\x84", 'ń', $text);
$text = str_replace("\xc5\x83", 'Ń', $text);

возврат $text;
> // utf82iso88592

Мне пришлось решить очень интересную задачу:

Я хотел заменить все \xXX в тексте на их буквы. К сожалению, XX были ASCII, а не utf8. Я решил свою проблему так:
( '/\\\\x([0-9a-fA-F])/e' , "pack('H*',utf8_decode('\\1') )", $v); ?>

Еще раз о польских буквах. Если вы используете решение fananf, убедитесь, что файл PHP закодирован с помощью cp1250, иначе он не будет работать. Это совершенно очевидно, однако я потратил некоторое время, прежде чем наконец понял это, поэтому решил опубликовать это здесь.

функция urlize ( $url ) <
$search = array( '/[^a-z0-9]/' , '/--+/' , '/^-+/' , '/ -+$/');
$replace = array('-', '-', '', '');
возврат preg_replace ($search, $replace, utf2ascii ($url));
>

функция utf2ascii ($string) <
$iso88591 = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7" ;
$iso88591 .= "\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF" ;
$iso88591 .= "\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF7" ;
$iso88591 .= "\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF" ;
$ ascii = "AAAAAACEEEEIIIDNOOOOOOOUUUUUYYY";
return strtr(mb_strtolower(utf8_decode($string), 'ISO-8859-1'), $iso88591, $ascii);
>

Какой самый быстрый и простой инструмент или метод для преобразования текстовых файлов между наборами символов?

В частности, мне нужно преобразовать UTF-8 в ISO-8859-15 и наоборот.

Возможно все: однострочники на вашем любимом языке сценариев, инструменты командной строки или другие утилиты для ОС, веб-сайтов и т. д.

Лучшие решения на данный момент:

В Linux/UNIX/OS X/cygwin:

Gnu iconv, предложенный Troels Arvin, лучше всего использовать в качестве фильтра. Кажется, он доступен повсеместно. Пример:

Как указал Бен, существует онлайн-конвертер, использующий iconv.

recode (вручную), предложенный Cheekysoft, преобразует один или несколько файлов на месте. Пример:

В этом используются более короткие псевдонимы:

Recode также поддерживает поверхности, которые можно использовать для преобразования между различными типами окончания строки и кодировкой:

Преобразование новых строк из LF (Unix) в CR-LF (DOS):

Файл кодировки Base64:

Вы также можете комбинировать их.

Преобразование файла UTF8 в кодировке Base64 с окончаниями строк Unix в файл Latin 1 в кодировке Base64 с окончаниями строк Dos:

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

(Однако нет поддержки ISO-8859-15; в нем говорится, что поддерживаемые кодировки: unicode, utf7, utf8, utf32, ascii, bigendianunicode, default и oem.)

Вы имеете в виду поддержку ISO-8859-1? Использование «String» делает это, например. наоборот

Примечание. Возможные значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii".

  • CsCvt – конвертер набора символов Kalytta – еще один отличный инструмент для преобразования на основе командной строки для Windows.

Просто наткнулся на это в поисках ответа на похожий вопрос – отличное резюме! Просто подумал, что стоит добавить, что recode также будет действовать как фильтр, если вы не передадите ему никаких имен файлов, например: recode utf8..l9 out.txt

Если вы используете enca , вам не нужно указывать входную кодировку. Часто достаточно просто указать язык: enca -L ru -x utf8 FILE.TXT.

На самом деле, iconv работал намного лучше как встроенный преобразователь, а не как фильтр. Преобразование файла с более чем 2 миллионами строк с помощью iconv -f UTF-32 -t UTF-8 input.csv > output.csv сэкономило всего около семисот тысяч строк, только треть. С помощью встроенной версии iconv -f UTF-32 -t UTF-8 file.csv успешно преобразованы все более 2 миллионов строк.

21 Ответ 21

Ни один из этих аргументов указывать не нужно. По умолчанию они будут соответствовать вашей текущей локали, обычно UTF-8.


Для всех, кого смущает отсутствие версий без тире, похоже, что версии iconv для OSX (и, возможно, все BSD) не поддерживают псевдонимы без тире для различных кодировок UTF-*. иконка -l | grep UTF сообщит вам обо всех кодировках, связанных с UTF, которые поддерживает ваша копия iconv.

Не знаете кодировку входного файла? Используйте charde in.txt, чтобы сгенерировать наилучшее предположение. Результат можно использовать как КОДИРОВАНИЕ в iconv -f КОДИРОВАНИЕ .

Предотвратить выход при недопустимых символах (избегая недопустимой последовательности ввода в сообщениях о позиции) и заменить «странные» символы «похожими» символами: iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in. txt > out.txt .

Мне это нравится, потому что это стандарт для большинства платформ NIX. Но также см. параметр команды VIM (псевдоним: ex ) ниже. Дополнительная информация: (1) вам (вероятно) не нужно указывать параметр -f (from) с iconv . (2) команда file --mime-encoding может помочь вам определить кодировку в первую очередь.

FWIW команда файла сообщила, что мой источник имеет вид UTF-16 Little Endian; работает iconv -f UTF-16 -t UTF-8. неправильно преобразовал его в ASCII, мне пришлось явно указать iconv -f UTF-16LE. для вывода UTF-8

Если у вас есть vim, вы можете использовать это:

Не тестировалось для каждой кодировки.

Самое интересное в этом то, что вам не нужно знать исходную кодировку

Имейте в виду, что эта команда изменяет непосредственно файл

Пояснение!

  1. + : используется vim для прямого ввода команды при открытии файла. Обычно используется для открытия файла в определенной строке: vim +14 file.txt
  2. | : разделитель нескольких команд (например, ; в bash)
  3. установить nobomb : нет спецификации utf-8
  4. set fenc=utf8 : установить новую кодировку для ссылки на документ utf-8
  5. x : сохранить и закрыть файл
  6. filename.txt: путь к файлу
  7. " : кавычки здесь из-за каналов. (иначе bash будет использовать их как каналы bash)

Довольно круто, но несколько медленно. Есть ли способ изменить это, чтобы конвертировать сразу несколько файлов (таким образом экономя затраты на инициализацию vim)?

Спасибо за объяснение! У меня были трудности с началом файла, пока я не прочитал о настройке бомба/нобомба.

например: find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | установить fenc=utf8 | х' <> \;

Я использовал это для преобразования кодировки CSV-файлов и был очень взволнован, когда увидел, что кодировка действительно изменилась. К сожалению, когда я начал загружать файл в MySQL, в нем было другое количество столбцов, чем то, которое было до запуска команды vim. Интересно, можно ли просто открыть файл, преобразовать кодировку и сохранить/закрыть файл, оставив все остальное содержимое файла без изменений?

В Linux вы можете использовать очень мощную команду recode, чтобы попытаться выполнить преобразование между различными кодировками, а также любые проблемы с окончанием строки. recode -l покажет вам все форматы и кодировки, между которыми может конвертировать инструмент. Вероятно, это будет ОЧЕНЬ длинный список.

Самая короткая версия, если вы можете предположить, что входная спецификация верна:

<р>. ой. Думаю, это почти одно и то же. У меня возникли проблемы с запуском вашего примера, потому что я предполагал, что обе версии используют один и тот же файл file-utf8.txt для ввода, поскольку они обе имеют один и тот же выходной файл, что и file-utf7.txt .

Это было бы действительно здорово, если бы не поддержка UTF16. Он поддерживает UTF32, но не UTF16! Мне не нужно было бы конвертировать файлы, за исключением того, что многие программы Microsoft (например, SQL server bcp) настаивают на UTF16, и тогда их утилита не будет конвертировать в нее. Мягко говоря, интересно.

Также существуют инструменты на основе iconv на многих языках.


Я поместил это в .bashrc :

..чтобы иметь возможность конвертировать файлы следующим образом:

лучше использовать tmp=$(mktmp) для создания временного файла. Кроме того, строка с rm избыточна.

В Windows я смог использовать Notepad++ для преобразования ISO-8859-1 в UTF-8. Нажмите "Кодировка", а затем "Преобразовать в UTF-8".

Кодировка символов всех соответствующих текстовых файлов определяется автоматически, и все соответствующие текстовые файлы преобразуются в кодировку utf-8:

Для выполнения этих шагов используется подоболочка sh с параметром -exec , запуск однострочного кода с флагом -c и передача имени файла в качестве позиционного аргумента "$1" с параметром -- <> . В промежутке выходной файл utf-8 временно называется convert .

-b , --brief Не добавлять имена файлов перед строками вывода (краткий режим).

-i , --mime Заставляет команду файла выводить строки MIME-типа, а не более традиционные, удобочитаемые для человека. Таким образом, он может сказать, например, text/plain; charset=us-ascii, а не текст ASCII. Команда sed обрезает это только до us-ascii, как того требует iconv .

Команда find очень полезна для такой автоматизации управления файлами. Нажмите здесь, чтобы узнать больше.

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

  • Изображение с битовой глубиной 1 имеет пиксели с двумя возможными значениями: черным и белым.
  • Изображение с битовой глубиной 8 имеет 2 8 или 256 возможных значений.
  • Изображения в режиме "Оттенки серого" с глубиной цвета 8 имеют 256 возможных значений серого.
  • Изображения в режиме RGB состоят из трех цветовых каналов. RGB-изображение с глубиной цвета 8 бит на пиксель имеет 256 возможных значений для каждого канала, что означает более 16 миллионов возможных значений цвета.

bit settings

Выберите битовую глубину изображения в Photoshop

Изображения RGB с 8 битами на канал (бит/канал или бит/канал) иногда называют 24-битными изображениями (8 бит x 3 канала = 24 бита данных для каждого пикселя). В дополнение к 8-битным изображениям на канал Photoshop также может работать с изображениями, которые содержат 16 или 32 бита на канал. Изображения с 32-битами на канал также известны как изображения с высоким динамическим диапазоном (HDR).

Bit-depth 1

Разрядность 1

Разрядность 8

Разрядность 8

Чтобы преобразовать свои битовые предпочтения, выполните одно из следующих действий:

Чтобы преобразовать 8 бит/канал в 16 бит/канал, выберите "Изображение" > "Режим" > "16 бит/канал" или "8 бит/канал" .

Чтобы преобразовать 8 или 16 бит/канал в 32 бит/канал, выберите "Изображение" > "Режим" > "32 бит/канал".

Поддержка 16-битных изображений на канал в Photoshop

Photoshop предоставляет следующую поддержку для работы с 16-битными изображениями на канал:

Работа в режимах "Оттенки серого", "Цвет RGB", "Цвет CMYK", "Лабораторный цвет" и "Многоканальный".

Используйте все инструменты из набора инструментов, кроме инструмента "Архивная художественная кисть" с изображениями 16 бит/канал.

Применить команды настройки цвета и тона.

Работа со слоями, включая корректирующие слои, в изображениях 16 бит/канал.

Применяйте многочисленные фильтры Photoshop, которые можно использовать с 16-битными изображениями на канал.

Чтобы воспользоваться преимуществами некоторых функций Photoshop, таких как некоторые фильтры, можно преобразовать 16-битное изображение на канал в 8-битное изображение на канал. Лучше всего выполнить команду "Сохранить как" и преобразовать копию файла изображения, чтобы в исходном файле сохранялись полные 16-битные данные изображения на канал.

Читайте также: