2017-02-01 10 views
0

Когда PHP выводит имена файлов из папки FTP производит французские символы, которые 3 символов, поэтому, когда мы var_dump:PHP выводит странный французский символ | é = строка (3)

var_dump("é"); 

Он показывает:

string(3) 

Но фактический характер должен быть

string(2) 

имена файлов вытягивают с помощью Wordpress функции

Когда это строка (3), мы не можем сделать preg_match на ней, чтобы заменить ее на стандартный символ ASCII.

Я пробовал объявлять форматирование как UTF-8, но это уже UTF-8. Также проверено

header('Content-Type: text/html; charset=iso-8859-1'); 

Но в результате искаженный текст.

Есть ли что-нибудь еще, что мы можем попробовать? Что это за персонаж?

+1

Это звучит очень похоже на http://stackoverflow.com/a/1725329/ 7496329 – Andy

+1

Убедитесь, что вы обернули имя файла в эхо с помощью htmlspecialchars - http://php.net/manual/en/function.htmlspecialchars.php – Brogan

+2

'string (1)' является 1-байтовой строкой; UTF-8 - это набор символов __multi-byte__, поэтому 1 символ не равен 1 байт –

ответ

1

Ваш персонаж на самом деле 0x65cc81, а не более обычного одного Unicode в элемент кода UTF-8 0xc3a9 (é Строчная латинская буква Е С ОСТРОЙ (U + 00E9)). 0x65cc81 является Unicode «Объединительная последовательность»: 0x65 is e «LATIN SMALL LETTER E» (U + 0065) и 0xcc81 is ́ «КОМБИНИРОВАННЫЙ ОСТРОЕННЫЙ АКЦЕНТ (U + 0301)».

Вы можете конвертировать из улавливающего последовательности в одной элемент кода с использованием РНР Normalizer:

function strhex($string) { 
    $hexstr = unpack('H*', $string); 
    return array_shift($hexstr); 
} 

$character = "é"; 
var_dump($character); 
var_dump(strhex($character)); 

$character = Normalizer::normalize($character); 

var_dump($character); 
var_dump(strhex($character)); 

дает

string(3) "é" 
string(6) "65cc81" 
string(2) "é" 
string(4) "c3a9" 
+0

Это прекрасно работает, спасибо за ваше время. Марк!и мы можем запустить это на целых строках, которые содержат специальные символы, а не только одиночные символы –

+0

Для тех, кто читает это, просто используйте знак $ character = Normalizer :: normalize ($ character); и он преобразует их в обычную единую кодовую точку –

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

  • Нет связанных вопросов^_^