Замена неправильных букв кодификации на SQL - PullRequest
1 голос
/ 18 ноября 2011

У меня есть база данных с данными из интернета, но некоторые страницы имеют неправильную кодификацию и буквы вроде ã становятся ã, а ç становятся ç.

Какие есть возможности исправить это?Я использую PostgreSQL.

Я могу использовать замену, но мне нужно делать замену для каждого случая?Я думал о переводе, но вижу, что он превращает только один символ в другой.Можно ли перевести два символа в один?Что-то вроде: TRANSLATE(text,'ã|ç','ã|ç').

Ответы [ 3 ]

3 голосов
/ 18 ноября 2011

Эта конкретная проблема выглядит так, как будто вы используете кодировку UTF-8, интерпретируемую как однобайтовый набор символов («ç», становящийся «ç§», предлагает iso-8859-1).

Вы можете исправить это индивидуально с помощью длинной цепочки replace(...) вызовов. Или вы можете использовать собственные средства преобразования символов в postgresql:

select convert_from(convert_to('£20 - garçon', 'iso-8859-1'), 'utf-8')

По порядку это:

  • Преобразует строку обратно в двоичный файл с использованием кодека iso-8859-1 (который просто изменит кодовые точки Юникода обратно в байты, при условии, что все кодовые точки меньше 256)
  • Повторно интерпретирует этот двоичный вывод как UTF-8, поэтому последовательности, такие как {0xc2, 0xa3}, переводятся в '£'
1 голос
/ 18 ноября 2011

PostgreSQL имеет функцию замены строк:

replace(string text, from text, to text): заменить все вхождения в string подстроки from на подстроку to

Пример:

replace ('abcdefabcdef', 'cd', 'XX') ==> abXXefabXXef

1 голос
/ 18 ноября 2011

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

Вы должны выяснить, какова правильная кодировка для этих страниц, и использовать ее при декодировании данных.

Некоторые страницы имеют кодировку в заголовке ответа, например,

Content-Type: text/html; charset=utf8

Некоторые страницы имеют кодировку в заголовке HTML, например,

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...