2015-05-08 4 views
0

Кодирование строки с немецкими умляутов как ä, ü, ö, ß с Javascript encodeURI() вызывает странные ошибки после декодирования его в PHP с rawurldecode (). Хотя строка, кажется, правильно декодирована, это не так. Смотрите пример ниже скриншоты из моего IDEJavascript encodeURI() по сравнению с PHP rawurldecode() и специальные символы

enter image description here enter image description here enter image description here

Кроме того, STRLEN() из - с rawurldecode() - декодируется строка дает больше символов, чем это действительно имеет!

Проблемы возникают, когда мне нужно обработать декодированную строку, например, если я хочу заменить немецкие символы ä, ü, ö с ae, ue и oe. Это можно увидеть в приведенном примере here.

Я также сделал PHP fiddle, где можно увидеть всю эту странность.

То, что я пытался до сих пор: - utf8_decode - Iconv - а также первые два предложения от here

ответ

0

Это Unicode equivalence вопрос, и это выглядит как ваш IDE Doesnt строк ручки мультибайтных очень хорошо.

В юникода можно представить и либо:

  • единственный юникода элемент кода (U + 00DC) или% C3% 9C в utf8
  • или использовать капитал U (U + 0055) с (U + 0308) или% 55% CC% 88 в utf8

В вашей строке GWT используется последний метод под названием NFD, в то время как ваш из PHP использует первый метод NFC. Вот почему ваша строка GWT длиннее на 3 символа, хотя они оба являются действительными кодировками логически идентичных строк Unicode. Ваша проблема заключается в том, что они не являются идентичным байтом для байта в PHP.

Подробнее о utf-8 normalisation.

Если вы хотите выполнить замену preg на строках, вам необходимо сначала нормализовать их в одну и ту же форму. Из вашего примера я вижу, что ваша среда IDE использует NFC, так как это строка PHP, которая работает. Поэтому я предлагаю нормализовать форму NFC в PHP (по умолчанию), а затем выполнить preg_replace.

http://php.net/manual/en/normalizer.normalize.php

function cleanImageName($name) 
{ 
    $name = Normalizer::normalize($name, Normalizer::FORM_C); 
     $clean = preg_replace(

В противном случае вы должны сделать что-то like this, который основан на this article.

Смежные вопросы