2012-04-09 2 views
1

Вот данные, которые я ввел в своем текстовом поле в форме. Текстовое поле имени: quiz_optionAпреобразовать французский символ в строку в php

value = ÉÉÉabcd. 

Я получаю данные из моей функции PHP ниже в пути

$this->_data = JRequest::get('post'); 
$string = $this->_data['quiz_optionA']; 

ниже метод я использовал конвертировать французский на английский

$normalizeChars = array(
'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj','Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A',  'Ã'=>'A', 'Ä'=>'A', 
'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 
'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 
'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 
'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 
'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 
'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f' 
); 


echo strtr($string, $normalizeChars);die; 

Выход:

A�A�A�abcd 

Normal en glish alphabets, преобразованные в строку. Но французские символы не преобразовывались как строка.

Выход должен быть EEEabcd. Не могли бы вы мне помочь?

+0

Сохранен ли ваш файл PHP в той же кодировке, что и в вашем браузере? У вас есть заголовки, указывающие кодировку? – Jon

+0

вы должны использовать многобайтовые строковые функции http://stackoverflow.com/questions/9986584/dealing-with-non-ascii-string-as-array-and-character – max

+0

Мой редактор работал с кодировкой символов «cp1252». Он показывает мне: «Некоторые символы не могут быть сопоставлены с использованием кодировки« cp1252 ». Или измените кодировку или удалите символы, которые не поддерживаются« кодировкой символов cp1252 ». Если я сохранен как utf8, он работал хорошо. способ конвертировать символ как формат utf8 в полное кодирование php? – ram

ответ

0

Сегодня я ответил на similar question Так что попробуйте использовать HTML-код, как это:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

И убедитесь, что ваш файл .php, который содержит $ normalizeChars имеет кодировку utf8.

0

Ваша линия

echo strtr($string, $normalizeChars); 

будет конвертировать только символы, которые вы указали в $normalizeChars. Те, которые вы пропустите, чтобы перевести, а именно É (Примечание: вы оставили кодировку этого символа в вашем вопросе неопределенным), не имеют никакой информации о переводе в $normalizeChars.

Если вы хотите, чтобы эти символы также переводились, вам необходимо добавить их в массив $normalizeChars. Похоже, что É - это действительно A� (если вы добавите hexdump, мы можем лучше сказать, что это такое).

Я бы предположить следующее:

Браузер посылает вход в приложение в UTF-8 кодировке. Вы обрабатываете их в одной однобайтовой кодировке (не-utf-8), поэтому она не изменяется.

Edit:

É; cp1252 #201; LATIN CAPITAL LETTER E WITH ACUTE; U+00C9 

То есть UTF-8 закодированы в PHP строку: "\xC3\x89". Чтобы кодировать почти любой символ в UTF-8, вам сначала нужно найти своего персонажа в кодировке, а это код кодировки unicode.С вашего примера:

Character: É 
Codepoint: LATIN CAPITAL LETTER E WITH ACUTE (U+00C9) 

элемент кода может быть преобразован в UTF-8 с небольшой PHP функции:

/** 
* @see Unicode 6.0.0 Ch2 General Structure, rfc3629 
* @param int|string $codepoint e.g. 0xC9/"U+00C9" 
* @return string 
*/ 
function unicodeCodePointToUTF8($codepoint) 
{ 
    is_string($codepoint) && sscanf($codepoint, 'U+%x', $codepoint); 
    if ($codepoint < 0) { 
     throw new InvalidArgumentException('Lower than 0x00.'); 
    } 
    if ($codepoint > 0x10FFFD) { 
     throw new InvalidArgumentException('Larger than 0x10FFFD.'); 
    } 
    if (0xD800 <= $codepoint && $codepoint <= 0xDFFF) { 
     throw new InvalidArgumentException(sprintf('High and low surrogate halves are invalid unicode codepoints (U+D800 through U+DFFF, is U+%04X).', $codepoint)); 
    } 
    if ($codepoint <= 0x7F) { 
     return chr($codepoint); 
    } 
    if ($codepoint <= 0x7FF) { 
     return chr(0xC0 | $codepoint >> 6 & 0x1F) . chr(0x80 | $codepoint & 0x3F); 
    } 
    if ($codepoint <= 0xFFFF) { 
     return chr(0xE0 | $codepoint >> 12 & 0xF) . chr(0x80 | $codepoint >> 6 & 0x3F) . chr(0x80 | $codepoint & 0x3F); 
    } 
    return chr(0xF0 | $codepoint >> 18 & 0x7) . chr(0x80 | $codepoint >> 12 & 0x3F) . chr(0x80 | $codepoint >> 6 & 0x3F) . chr(0x80 | $codepoint & 0x3F); 
} 

Использование:

echo bin2hex(unicodeCodePointToUTF8(0x00C9)), "\n"; # c389 

шестнадцатеричное выход может быть записано в строке формы в PHP путем префикса его \x в строке с двумя кавычками:

$binary = "\xC3\x89"; 

Этот способ письма не защищен от кодирования фактического файла PHP.

+0

Мой редактор работал с кодировкой символов «cp1252». Он показывает мне «Некоторые символы не могут быть сопоставлены с использованием кодировки символов« cp1252 ». Или измените кодировку или удалите символы, которые не поддерживаются кодировкой символов« cp1252 ». Если Я сохранил как utf8, он работал хорошо. Любой другой способ конвертировать символ как формат utf8 в полное кодирование php? – ram

+0

@ram: Я продлил ответ. Допустимо, если что-то действительно UTF-8, я перекрестно свяжу вопрос: [Быстрый способ удалить все символы, которые не отображаются в браузере из строки utf8] (http://stackoverflow.com/a/7635283/367456) (Возможно, вы не можете нужно это). – hakre

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