Где я могу найти биты UTF8 в таблицу символов для преобразования, например, "Ã ±" в "ñ"? - PullRequest
2 голосов
/ 13 октября 2010

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

Как упомянуто в названии, я хочу, например, знать, что означает «Ã ±» (этот я уже знаю .. «ñ»), но не только для испанских символов, но и для других ( Я уже знаю польские).

Основная проблема в том, что у меня есть строка в PHP, которая иногда может встречаться, например, как "eñe" (что нормально), а другие как "eà ± e" ... и в последнем случае я смогу изменить ее на " eñe "так что это читабельно .. но если все в порядке, я не хочу его менять. Чтобы сделать это, я использовал функцию utf8_decode, но в случае, если строка читаема, она все равно изменит «ñ» на «■» (но белый) .. поэтому я не всегда могу декодировать строку, и если я использую функцию mb_detect_encoding, я всегда получу "UTF-8" в качестве ответа ... и это не очень полезно ..

Как только я узнаю все битовые символы utf8, записанные как, например, «ñ» для «ñ», «Å¹» для «Ź» и т. Д., Я планирую выполнить функцию, которая в основном заменит одну на другую. ... что-то вроде того, что делает utf8_decode .. если у кого-то здесь нет лучшего решения!

Заранее спасибо! Привет!

Ответы [ 3 ]

9 голосов
/ 13 октября 2010

Почему вы хотите это сделать? Вы хотите восстановить поврежденные данные или около того?

Это действительно не должно быть частью обычного потока бизнес-кода. Все, что вам нужно сделать, это убедиться, что все слои вашего веб-приложения правильно используют UTF-8. Источник PHP, заголовок и тело ответа HTTP, таблица БД, соединение с БД и так далее. Смотрите также PHP UTF-8 cheatsheet .

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

В качестве доказательства можно указать, что в кодировке Unicode ( UTF-8 ), ñ ( Unicode-символ 'LATIN SMALL LETTER N WITH TILDE' '(U + 00F1) ) существует -байтовое кодирование) байтов 0xC3 и 0xB1. Когда эти байты кодируются с использованием однобайтовой кодировки, такой как ISO-8859-1, тогда 0xC3 становится Ã и 0xB1 становится ±. См. Также макет кодовой страницы ISO-8859-1 .

4 голосов
/ 13 октября 2010

Проблема в том, что если у вас есть mojibake , то нет надежного способа преобразовать его обратно в то, что оно должно было означать.См. этот параграф в Википедии для объяснения проблемы:

Рассмотрим текстовый файл, содержащий немецкое слово für в кодировке ISO-8859-1,Этот файл теперь открывается с помощью текстового редактора, который предполагает ввод UTF-8.Поскольку первый байт (0x66) находится в диапазоне 0x00 - 0x7F, UTF-8 правильно интерпретирует его как f.Второй байт (0xFC) не является допустимым значением для начала любого символа в кодировке UTF-8.Поэтому текстовый редактор может заменить байт символом замены, чтобы предупредить пользователя о том, что что-то пошло не так.Последний байт (0x72) также находится в диапазоне кодов 0x00 - 0x7F и может быть правильно декодирован.Вся строка теперь отображается так: f�r.

Плохо реализованный текстовый редактор может сохранить замену в форме UTF-8;тогда данные текстового файла будут выглядеть так: 0x66 0xEF 0xBF 0xBD 0x72, который снова будет отображаться в ISO-8859-1 как f�r. Замена также уничтожает исходный байт, делая невозможным восстановление того, какой символ был предназначен.

Необходимо избегать неверной интерпретации текста с использованием неправильной кодировки с самого начала.Исправлять, когда он сломан, слишком поздно.

0 голосов
/ 13 октября 2010

Ваша проблема - это проблема интерпретации, а не транскодирования.На любом современном компьютере - обычно вводится как двоичный 0xc3b1, так как это его код UTF-8.Если вы интерпретируете это (без транскодирования) в старом коде iso-latin-15, вы получите 0xc3 = Ã, а затем 0xb1 = ±.Вот почему нет «таблицы»: это проблема с отображением.

Лучшее, что можно сделать, это полностью избежать изо-латинского языка.Это доставит вам массу проблем.Реальный способ исправить вашу программу: везде использовать только utf-8, это сэкономит вам много времени и головной боли.

А пока, если вы действительно хотите получить эквивалентный iso-latin-15строка на ваш ввод utf-8 (что не так, если вы правильно поняли выше), вы можете передать вашу строку любому конвертеру кода, попросив преобразовать utf-8 в iso-latin-15 .Одна вещь, которую вы должны быть осторожны, это двойное транскодирование.Если у вас была строка utf-8 и вы ошибочно запросили преобразование из iso-lating-15 в utf-8, то вы получили строку utf-8, которая фактически говорит Ã ±, что является двоичным 0xc383c2b1.Чтобы получить обратно правильную строку utf-8, anwser такой же: попросите преобразовать искаженную строку из utf-8 в iso-latin-15, которая с радостью примет 0xc383 и преобразует ее в 0xc3, затем в 0xc2b1 и преобразует в0xb1, давая вам правильную строку utf-8, содержащую правильную -.

Специально для PHP и веб-приложений, помните, что многие компьютеры (и все больше и больше в будущем) будут отправлять вам utf-8 по умолчанию.

...