странные проблемы кодировки символов со строками - PullRequest
1 голос
/ 22 ноября 2011

То, что может показаться простой операцией, полностью испорчено здесь кодировкой.Я просто хочу проверить, является ли первый символ строки £.Мой php-файл сам по себе имеет кодировку UTF8-Without BOM.Спасибо!

<?php
print "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' "; 
print "'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n";
print "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='eng' lang='en'>\n";
print "<head>\n";
print "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />\n";
print "<title>WAMP</title>\n";
print "<meta name='Description' content='Website Under Construction' />\n";
print "</head>\n";
print "<body>\n";
print "<p>\n";

$temp = "£Hello";
$charArray = preg_split('//', $temp, -1);
// preg_match_all('/./', $temp, $charArray);

print_r ($charArray);
print "<br />First Char: $temp[0]";

print "</p>\n";
print "</body>\n";
print "</html>";
?>

Вывод:

Array ( [0] => [1] => � [2] => � [3] => H [4] => e [5] => l [6] => l [7] => o [8] => )
First Char: �

Желаемый вывод:

Array ( [0] => [1] £ [2] => H [3] => e [4] => l [5] => l [6] => o [7] => ) 
First Char: £

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Учитывая, что вы отправляете HTML с соответствующими заголовками типа контента, я предполагаю, что вы запускаете это через веб-сервер Apache. Если нет, то, пожалуйста, не обращайте на меня внимания, но в настройках сервера может быть настройка для этого ...

Я уже сталкивался с этой проблемой раньше, и абсолютно все должно быть в режиме UTF8, чтобы оно работало.

В частности, здесь, я подозреваю, вам нужно создать файл .htaccess в том же каталоге, что и ваш скрипт, содержащий что-то вроде этого:

AddDefaultCharset UTF-8

Перезапуск Apache, очевидно.

Еще одно замечание: если вы планируете использовать базу данных MySQL, вам также необходимо убедиться, что соединение закодировано в формате UTF8, выполнив следующую команду SQL после соединения:

SET NAMES utf8
1 голос
/ 23 ноября 2011

Вместо $temp[0], который не поддерживает многобайтовые запросы, попробуйте mb_substr():

if( mb_substr($temp, 0, 1, 'UTF-8') == '£' )
{
  ...
}
...