Где я могу найти биты UTF8 в таблицу символов для преобразования, например, "ñ" в "ñ"?

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

Ваша проблема - это проблема интерпретации, а не транскодирования. На любом современном компьютере - обычно вводится как двоичный 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, ответчик тот же: попросите преобразовать искаженную строку из utf-8 в iso-latin-15, которая с радостью примет 0xc383 и преобразует ее в 0xc3, затем в 0xc2b1 и преобразует ее в 0xb1, давая вам правильную строку utf-8, содержащую правильное значение ñ.

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

Другие вопросы по тегам