Проблема кодирования CakePHP: хранение заглавной буквы S с верхним регистром, сохранение в базе данных, но вызывает ошибки при обработке тортом - PullRequest
0 голосов
/ 01 июля 2011

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

В моем скрипте я создаю список терминов из транслитации планшета.

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

Пример:

Частичное содержимое планшета:

  1. UTU-Dis-ню il2

Термины с планшета при обработке моим скриптом:

УТУ-ДИШ, -nu-il2

должно быть:

UTU-Dis-ню il2

Когда я печатаю содержимое моего массива в ходе обработки содержимого, я вижу это:

  1. utu-DIn -nu-il2

Таким образом, это означает, что неправильный анализ текста создает пробел, который интерпретируется в моем сценарии как 2 слова вместо одного.

В базе данных текст в порядке ...

Я также получаю эти ошибки:

Предупреждение (512): ошибка SQL: 1366: неверное строковое значение: '\ xC5' для столбца 'term' в строке 1 [CORE \ cake \ libs \ model \ datasources \ dbo_source.php, строка 684]

Запрос: INSERT INTO terms (term, lft, rght) VALUES ('utu-DI ', 449, 450)

Запрос: INSERT INTO terms (term, lft, rght) VALUES ('A ', 449, 450)

Запрос: INSERT INTO terms (term, lft, rght) VALUES ('xDI ', 449, 450)

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

Спасибо!

Добавлена ​​информация:

    $terms=$this->data['Tablet']['translit'];
$terms= str_replace(array('\r\n', '\r', '\n','\n\r','\t'), ' ', $terms);
$terms = trim($terms, chr(173));
print_r($terms);
$terms = preg_replace('/\s+/', ' ', $terms);
$terms = explode(" ", $terms);
$terms=array_map('trim', $terms);
$anti_terms = array('@tablet','1.','2.','3.','4.','5.','6.','7.','7.','9.','10.','11.','12.','13.','14.','15.','16.','17.','18.','19.','20.','Rev.',
'Obv.','@tablet','@obverse','@reverse','C1','C2','C3','C4','C5','C6','C7','C8','C9', '\r', '\n','\r\n', '\t',''. ' ', null, chr(173), 'x', '[x]','[...]' );
foreach($terms as $key => $term) {
    if(in_array($term, $anti_terms) || is_numeric($term)) {
        unset($terms[$key]);
        }
    }

Если я поставлю свой print_r перед прегом, S будут хорошими, если я сделаю это после, они будут отображаться с чёрной лепешкой. Так что я думаю, что функция preg - это проблема!


только что нашел это: http://www.php.net/manual/fr/function.preg-replace.php#84385

Но похоже, что

* * Mb_ereg_replace тысячи семьдесят-девять ()

вызывает ту же проблему, что и preg_replace () ....


Раствор:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
$terms = mb_ereg_replace('\s+', ' ', $terms);

и ошибка исчезла ...!

1 Ответ

0 голосов
/ 02 июля 2011
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
$terms = mb_ereg_replace('\s+', ' ', $terms);
...