ARC2 (библиотека семантической сети PHP) ошибочно дважды конвертирует файл UTF-8 в UTF-8 - PullRequest
2 голосов
/ 17 февраля 2012

При использовании ARC2 текстовые данные будут повреждены.

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

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

Пример: "surmonté" & rarr; "SurmonteÌ".

Этот "surmonteÌ" фактически доступен в UTF-8 в базе данных.

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

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

1 Ответ

1 голос
/ 18 февраля 2012

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

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

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


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

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