Есть ли скрытые ошибки кодировки, которые мне нужно исправить в Latin 1 - ›UTF-8?

Мне все еще нужно выполнять полное преобразование latin1 в UTF 8 для текста, который выглядит совершенно нормально?

Я меняю местами программное обеспечение форума, а старая база данных форума использовала кодировку Latin1. В новой базе данных форума для таблиц используется кодировка UTF8.

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

Я вручную исправлял видимые ошибки с помощью функции поиска и замены на основе информации о преобразовании, указанной здесь: http://www.i18nqa.com/debug/utf8-debug.html

Остальной текст выглядит нормально и полностью читаем.

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

Так что мне все еще нужно выполнить полное преобразование latin1 в UTF 8 для текста, который выглядит совершенно нормально?

Я бы не стал, потому что я изменил некоторые теги BB-кода в нескольких полях после того, как они были сохранены в UTF 8, поэтому был обеспокоен тем, что эти обновления застряли бы символы UTF8 в середине символов Latin1, и пытались полное преобразование смешанных наборов символов еще больше испортит ситуацию.


person Jeff Widman    schedule 23.01.2015    source источник
comment
Ну, вы в основном спрашиваете, можно ли здесь срезать углы. Строгий подход заключался бы в декодировании из Latin1 и кодировании в UTF-8 и только затем в внесении изменений в контент. Все, что меньше этого, может привести к неверным данным.   -  person Simeon Visser    schedule 24.01.2015
comment
Я не был уверен, потому что думал, что UTF-8 обратно совместим с ASCII, а Latin1 - в основном ASCII, поэтому отличаются только крайние случаи, которые необходимо обновить.   -  person Jeff Widman    schedule 24.01.2015
comment
Лучше не предполагать ничего о кодировках и свойствах, которые они имеют (думайте о них как о черных ящиках). Чтобы преобразовать A в B, вы декодируете из A и кодируете в B.   -  person Simeon Visser    schedule 24.01.2015
comment
возможный дубликат Как определить UTF- 8 символов в столбце с кодировкой Latin1 - MySQL   -  person Jonathan Leffler    schedule 24.01.2015
comment
Эх, ответ может быть похож, но вопрос другой. Я специально прочитал этот вопрос еще до того, как задал этот. Это о том, как обнаруживать различия, это о том, можно ли использовать ярлык ... С функциональной точки зрения мне нужно было знать, что это нормально использовать ярлык, если вы конвертируете все символы в этом диапазоне.   -  person Jeff Widman    schedule 24.01.2015


Ответы (1)


Любые символы из ISO 8859-1 (Latin 1) в диапазоне 0x80..0xFF необходимо перекодировать как 2 байта в UTF-8. Первый байт - 0xC2 для 0x80..0xBF; первый байт - 0xC3 для 0xC0..0xFF. Второй байт получается из исходного значения из Latin 1 путем установки двух старших битов на 1 и 0. Для символов 0x80..0xBF значение второго байта не изменилось с Latin 1. Если вы использовали 8859- 15, у вас может быть несколько более сложных преобразований (символ евро кодируется иначе, чем другие символы Latin 1).

Есть множество инструментов, чтобы помочь. iconv - один из таких.

person Jonathan Leffler    schedule 23.01.2015
comment
Значит, если они не в этом диапазоне, их не нужно преобразовывать? Могу ли я найти этих персонажей с помощью этого запроса? SELECT post_id, CONVERT(CONVERT(message USING BINARY) USING latin1) AS latin1, CONVERT(CONVERT(message USING BINARY) USING utf8) AS utf8 FROM xf_post WHERE CONVERT(message USING BINARY) RLIKE CONCAT('[', UNHEX('80'), '-', UNHEX('FF'), ']') - person Jeff Widman; 24.01.2015
comment
Кодовые точки Unicode от U + 0000 до U + 007F идентичны кодовым точкам ISO 8859-x от 0x00 до 0x7F и кодируются как отдельные байты в диапазоне 0x00..0x7F в UTF-8, поэтому нет необходимости беспокоиться о символах из диапазона 'plain ASCII'. Краткий ответ на вопрос, будет ли работать ваш запрос, - я не знаю. Лучшее, что я могу сказать, это попробовать. Поместите несколько символов с диакритическими знаками в таблицу в 8859-1, затем попробуйте выполнить запрос. Если это сработает, ответ - да. Если нет, то нет. - person Jonathan Leffler; 24.01.2015
comment
Спасибо! Запрос, взятый отсюда, кстати - похоже, работает в базовом тестировании: stackoverflow.com/questions/9304485/ - person Jeff Widman; 24.01.2015
comment
Похоже, это может быть подходящим дубликатом для этого вопроса; похоже, он решает ту же проблему (переход с Latin 1 на UTF-8 в MySQL). - person Jonathan Leffler; 24.01.2015