2012-02-17 5 views
2

Используя ARC2, текстовые данные повреждаются.ARC2 (семантическая веб-библиотека PHP) неправильно преобразует файл UTF-8 в UTF-8

Мой входной файл RDF находится в UTF-8. Он загружается в ARC2, который использует бэкэнд MySQL, через запрос LOAD <path/to/file.rdf>. База данных MySQL также находится в UTF-8, так как проверяется с помощью PHPMyAdmin.

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

Пример: "surmonté" → "surmonteÌ".

Этот «surmonteÌ» доступен в UTF-8 в базе данных.

Связано ли это с тем, как ARC2 открывает файлы (копание кода, но не исчерпывающее, но довольно глубокое, не показало ничего подозрительного), или это может быть более общий случай с PHP и MySQL?

Как я могу убедиться, что импортированные данные не ошибочно перекодированы, а взяты за оригинал?

+0

Является ли ARC2 указанием кодировки для файла или подключения к базе данных в любой точке? Если нет, это, вероятно, будет по умолчанию latin1, откуда и возникает ваша проблема. – deceze

+0

@deceze Да, это, конечно, первое, что я проверил, и он явно [создает базу данных и сортировку в UTF-8] (https://github.com/semsol/arc2/blob/master/store/ARC2_Store. php # L59). Тогда он явно не указывает его при подключении к базе данных, но я не знаю, будет ли это иметь какой-то смысл ...? – MattiSG

+0

База данных и сортировка не имеют смысла без кодировки соединения. См. Http://kunststube.net/frontback – deceze

ответ

1

ARC2 использует две функции: $store->setUp(), которые CREATE s TABLE s и DATABASE в случае необходимости; и query(LOAD…, подробно в вопросе.

Оказывается, то setUp() часть должна не вызываться в том же сценарии, как load части. По крайней мере, не во время одного и того же исполнения. Решение, которое я принял, состояло в том, чтобы сделать два отдельных сценария: один для запуска базы данных, другой для загрузки данных, но просто комментирование части init, как только это будет сделано, также будет работать. В любом случае, трюк заключается в том, чтобы убедиться, что загрузка не состоится сразу после инициализации.

Это происходит потому, что спецификация кодирования SET NAMES utf8 при соединении с БД установлена ​​только after collation detection, для которой MySQL, похоже, не обнаруживает должным образом, если база данных только что была создана. Я сделал pull request исправления.


Как примечание стороны, это не эффективно использовать LOAD <path/to/file.rdf конструкцию вопроса: это будет вычисляться как относительный веб адрес, вызова сервера для загрузки из себя по сети. Гораздо эффективнее использовать конструкцию, такую ​​как:

$store->query('LOAD <file://' . dirname(__FILE__) . '/path/to/file.rdf>')