Как декодировать строку, дважды кодированную в UTF-8, в простой UTF-8? - PullRequest
6 голосов
/ 19 сентября 2009

У меня огромная таблица MySQL, строки которой закодированы в UTF-8 дважды.Например, «ratjratárgyalja» хранится как «Ãšjratárgyalja».

Соединитель MySQL .Net загружает их таким образом.Я перепробовал множество комбинаций с System.Text.Encoding.Convert(), но ни одна из них не сработала.

Отправка set names 'utf8' (или другой кодировки) не решит проблему.

Как я могу декодировать их из двойного UTFОт -8 до UTF-8?

Ответы [ 3 ]

8 голосов
/ 19 сентября 2009

Странная проблема, но я думаю, что я могу воспроизвести ее с помощью подходяще-нечестивой смеси UTF-8 и Latin-1 (но не только двумя использованиями UTF-8 без перемежающегося ошибочного шага в Latin-1). Вот странный круговорот, «туда и обратно» (Python 2. * или IronPython должны быть в состоянии воспроизвести это):

# -*- coding: utf-8 -*-
uni = u'Újratárgyalja'
enc1 = uni.encode('utf-8')
enc2 = enc1.decode('latin-1').encode('utf-8')
dec3 = enc2.decode('utf-8')
dec4 = dec3.encode('latin-1').decode('utf-8')

for x in (uni, enc1, enc2, dec3, dec4):
  print repr(x), x

Это интересный вывод ...:

u'\xdajrat\xe1rgyalja' Újratárgyalja
'\xc3\x9ajrat\xc3\xa1rgyalja' Újratárgyalja
'\xc3\x83\xc2\x9ajrat\xc3\x83\xc2\xa1rgyalja' Ãjratárgyalja
u'\xc3\x9ajrat\xc3\xa1rgyalja' Ãjratárgyalja
u'\xdajrat\xe1rgyalja' Újratárgyalja

Странная строка, начинающаяся с Ã, выглядит как enc2, то есть два кодирования utf-8 с декодированием с перемежением latin-1, добавляемым в микс. И, как вы можете видеть, это может быть отменено с помощью точно противоположной последовательности операций: декодировать как utf-8, перекодировать как latin-1, повторно декодировать как utf-8 снова - и исходная строка вернется (yay !).

Я полагаю, что обычные свойства в обоих направлениях для Latin-1 (также известный как ISO-8859-1) и UTF-8 должны гарантировать, что эта последовательность будет работать (извините, пока нет C #, чтобы попробовать на этом языке сейчас, но я ожидаю, что последовательности кодирования / декодирования не должны зависеть от конкретного используемого языка программирования).

1 голос
/ 12 октября 2009

Когда вы пишете «Соединитель MySQL .Net загружает их таким образом». есть хороший шанс, что это означает, что коннектор MySQL .Net считает, что он говорит на латыни-1 для MySQL, в то время как MySQL считает, что разговор идет в UTF-8. Также существует вероятность, что столбец объявлен как Latin-1, но на самом деле содержит данные UTF-8.

Если это последний (столбец, помеченный как Latin-1, но данные на самом деле UTF-8), вы получите загадочные проблемы с сопоставлением и другие ошибки, если будете использовать функции обработки текста MySQL, ORDER BY для столбца или другие ситуации, текст «что-то значит», а не просто байты, отправленные по проводам.

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

0 голосов
/ 19 сентября 2009

Вы можете попробовать использовать

SELECT CONVERT(`your_column` USING ascii)
FROM `your_table`

на уровне запросов MySQL. Это удар в темноте.

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