несоответствие массива, не находя символы с акцентом - PullRequest
2 голосов
/ 27 января 2012

Ну ... я в тупике, но я уверен, что есть простое решение, я надеюсь!

Я использую Joomla, и следующий код просматривает заголовок статьи Joomla, перетаскиваемый на страницу, и помещает соответствующее изображение флага слева от заголовка.

<?php

$images = array (

'Montgenèvre' => 'images/flags/small/france_sm.jpg',        
'Jugendgastehaus Edthöf' => 'images/flags/small/austria_sm.jpg',    
'Jugendgästehaus Wenghof' => 'images/flags/small/austria_sm.jpg',
'Hotel Stadlmühle' => 'images/flags/small/austria_sm.jpg',
'ClubHotel Provençal' => 'images/flags/small/france_sm.jpg'
);

if (isset($images[$this->item->title])) {
?>
<?php } ?>
<img src="<?php echo $images[$this->item->title]; ?>" /> <?php echo $this->item->title; ?>

Все отлично работает на обычных словах, таких как 'Лондон' или США ', но у меня есть проблемы, когда массив не работает / не совпадает, когда в моих заголовках есть символы с акцентом, например:

é ö ü è ç

В статье Joomla название статьи было вставлено так - Montgenèvre

Есть ли решение для этого?

Отредактировано: Вывод, который я получаю из отладки, следующий (включая мои другие массивы):

- 4D 6F 6E 74 67 65 6E C3 A8 76 72 65 (Montgenèvre)
+ 41 6E 64 6F 72 72 61 (Andorra)
+ 47 72 61 6E 64 76 61 6C 69 72 61 (Grandvalira)
+ 56 61 6C 6C 6E 6F 72 64 (Vallnord)
+ 48 6F 74 65 6C 20 4D 61 72 63 6F 20 50 6F 6C 6F (Hotel Marco Polo)
+ 48 6F 74 65 6C 20 41 75 73 74 72 69 61 (Hotel Austria)
+ 41 75 73 74 72 69 61 (Austria)
+ 41 6D 61 64 E9 (Amad�)
+ 42 61 64 20 4B 6C 65 69 6E 6B 69 72 63 68 68 65 69 6D (Bad Kleinkirchheim)
+ 4D 61 6C 6C 6E 69 74 7A (Mallnitz)
+ 4E 61 73 73 66 65 6C 64 (Nassfeld)
+ 4F 62 65 72 74 61 75 65 72 6E (Obertauern)
+ 53 61 61 6C 62 61 63 68 2D 48 69 6E 74 65 72 67 6C 65 6D 6D (Saalbach-Hinterglemm)
+ 53 63 68 6C 61 64 6D 69 6E 67 2D 41 6D 61 64 E9 (Schladming-Amad�)
+ 53 6B 69 77 65 6C 74 (Skiwelt)
+ 57 69 6C 64 73 63 68 F6 6E 61 75 (Wildsch�nau)
+ 5A 65 6C 6C 20 61 6D 20 53 65 65 (Zell am See)
+ 5A 69 6C 6C 65 72 74 61 6C (Zillertal)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 48 6F 72 62 72 75 6E 6E (Jugendg�stehaus Horbrunn)
+ 47 61 73 74 68 6F 66 20 41 69 67 6E 65 72 (Gasthof Aigner)
+ 48 6F 74 65 6C 20 53 74 61 64 6C 6D FC 68 6C 65 (Hotel Stadlm�hle)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 4B 69 74 7A 73 74 65 69 6E 68 6F 72 6E (Jugendg�stehaus Kitzsteinhorn)
+ 4A 75 67 65 6E 64 70 65 6E 73 69 6F 6E 20 41 6E 67 65 72 68 6F 66 (Jugendpension Angerhof)
+ 47 6F 6C 64 65 6E 65 72 20 4C 6F 77 65 (Goldener Lowe)
+ 47 61 73 74 68 6F 66 20 53 74 61 6D 6D 65 72 68 6F 66 (Gasthof Stammerhof)
+ 46 65 72 69 65 6E 67 75 74 20 47 72 75 62 68 6F 66 (Feriengut Grubhof)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 48 6F 63 68 6B 6F 67 65 6C (Jugendg�stehaus Hochkogel)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 42 61 63 68 62 61 75 65 72 6E 68 6F 66 (Jugendg�stehaus Bachbauernhof)
+ 4A 75 67 65 6E 64 68 65 69 6D 20 42 65 72 67 68 6F 66 (Jugendheim Berghof)
+ 47 61 73 74 68 61 75 73 20 54 68 75 72 6E 65 72 68 6F 66 (Gasthaus Thurnerhof)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 46 65 6C 73 65 72 61 6C 6D (Jugendg�stehaus Felseralm)
+ 53 70 6F 72 74 68 6F 74 65 6C 20 4C 65 69 74 6E 65 72 (Sporthotel Leitner)
+ 47 61 73 74 68 6F 66 20 47 61 69 6C 74 61 6C 65 72 68 6F 66 (Gasthof Gailtalerhof)
+ 47 61 73 74 68 6F 66 20 45 72 6C 65 6E 68 6F 66 (Gasthof Erlenhof)
+ 48 6F 74 65 6C 20 42 69 63 68 6C 68 6F 66 (Hotel Bichlhof)
+ 48 6F 74 65 6C 20 54 68 75 72 6E 65 72 68 6F 66 (Hotel Thurnerhof)
+ 53 70 6F 72 74 68 6F 74 65 6C 20 4D 69 72 6E 6F 63 6B (Sporthotel Mirnock)
+ 4A 75 67 65 6E 64 68 65 69 6D 20 57 65 69 74 65 6E 6D 6F 6F 73 (Jugendheim Weitenmoos)
+ 4A 75 67 65 6E 64 68 6F 74 65 6C 20 53 69 6D 6F 6E 79 68 6F 66 (Jugendhotel Simonyhof)
+ 4A 47 48 20 53 61 72 69 6E 67 67 75 74 (JGH Saringgut)
+ 50 65 6E 73 69 6F 6E 20 57 61 6C 63 68 68 6F 66 67 75 74 (Pension Walchhofgut)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 57 65 6E 67 68 6F 66 (Jugendg�stehaus Wenghof)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 4D 61 72 6B 75 73 68 6F 66 (Jugendg�stehaus Markushof)
+ 4A 75 67 65 6E 64 67 E4 73 74 65 68 61 75 73 20 45 64 74 68 6F 66 (Jugendg�stehaus Edthof)
+ 43 61 6E 61 64 61 (Canada)
+ 4C 65 20 4D 61 73 73 69 66 20 26 20 4D 6F 6E 74 20 53 61 69 6E 74 65 20 41 6E 6E 65 (Le Massif & Mont Sainte Anne)
+ 54 72 65 6D 62 6C 61 6E 74 (Tremblant)
+ 4C 65 73 20 53 75 69 74 65 73 20 54 72 65 6D 62 6C 61 6E 74 (Les Suites Tremblant)
+ 43 68 61 74 65 61 75 20 4D 6F 6E 74 20 53 61 69 6E 74 65 20 41 6E 6E 65 (Chateau Mont Sainte Anne)
+ 46 72 61 6E 63 65 (France)
+ 41 6C 70 65 20 44 60 48 75 65 7A (Alpe D`Huez)
+ 4C 65 20 43 6F 72 62 69 65 72 (Le Corbier)
+ 4C 65 73 20 44 65 75 78 20 41 6C 70 65 73 (Les Deux Alpes)
+ 4D 6F 6E 74 67 65 6E E8 76 72 65 (Montgen�vre)
+ 52 69 73 6F 75 6C (Risoul)
+ 4C 65 73 20 4F 72 72 65 73 (Les Orres)
+ 4D 6F 72 7A 69 6E 65 (Morzine)
+ 53 65 72 72 65 20 43 68 65 76 61 6C 69 65 72 (Serre Chevalier)
+ 4D 65 72 69 62 65 6C 20 2F 20 54 72 6F 69 73 20 56 61 6C 6C E9 65 73 (Meribel / Trois Vall�es)
+ 48 6F 74 65 6C 20 4C 65 20 50 69 65 64 20 4D 6F 75 74 65 74 (Hotel Le Pied Moutet)
+ 48 6F 74 65 6C 20 44 65 73 20 4E 65 69 67 65 73 (Hotel Des Neiges)
+ 48 6F 74 65 6C 20 4C 20 41 6E 63 6F 6C 69 65 (Hotel L Ancolie)
+ 43 65 6E 74 72 65 20 64 65 20 56 61 63 61 6E 63 65 73 20 4C 20 45 73 63 61 6C 61 64 65 (Centre de Vacances L Escalade)
+ 48 6F 74 65 6C 20 53 65 72 72 65 20 43 68 65 76 61 6C 69 65 72 (Hotel Serre Chevalier)
+ 51 75 61 74 72 65 20 53 61 69 73 6F 6E 73 (Quatre Saisons)
+ 48 6F 74 65 6C 20 4C 65 73 20 43 68 61 6C 65 74 73 (Hotel Les Chalets)
+ 49 74 61 6C 79 (Italy)
+ 41 70 72 69 63 61 (Aprica)
+ 42 61 72 64 6F 6E 65 63 63 68 69 61 (Bardonecchia)
+ 43 69 76 65 74 74 61 (Civetta)
+ 46 6F 6C 67 61 72 69 61 (Folgaria)
+ 50 69 61 6E 63 61 76 61 6C 6C 6F (Piancavallo)
+ 50 61 73 73 6F 20 54 6F 6E 61 6C 65 (Passo Tonale)
+ 48 6F 74 65 6C 20 52 6F 6D 61 (Hotel Roma)
+ 48 6F 74 65 6C 20 42 65 7A 7A 69 (Hotel Bezzi)
+ 48 6F 74 65 6C 20 4C 6F 63 61 6E 64 61 20 4C 6F 63 61 74 6F 72 69 (Hotel Locanda Locatori)
+ 48 6F 74 65 6C 20 52 65 67 69 6E 61 (Hotel Regina)
+ 48 6F 74 65 6C 20 53 74 65 6C 6C 61 20 4D 6F 6E 74 69 73 (Hotel Stella Montis)
+ 48 6F 74 65 6C 20 4D 69 6C 61 6E 6F (Hotel Milano)
+ 48 6F 74 65 6C 20 53 61 79 6F 6E 61 72 61 (Hotel Sayonara)
+ 48 6F 74 65 6C 20 54 6F 6D 61 73 69 (Hotel Tomasi)
+ 48 6F 74 65 6C 20 47 61 72 64 65 6E (Hotel Garden)
+ 48 6F 74 65 6C 20 43 61 73 61 20 41 6C 70 69 6E 61 (Hotel Casa Alpina)
+ 48 6F 74 65 6C 20 56 69 6C 6C 61 67 69 6F 20 4F 6C 69 6D 70 69 63 6F (Hotel Villagio Olimpico)
+ 48 6F 74 65 6C 20 53 6F 6D 6D 65 69 6C 6C 65 72 (Hotel Sommeiller)
+ 48 6F 74 65 6C 20 54 6F 72 65 6E 61 (Hotel Torena)
+ 48 6F 74 65 6C 20 53 70 6F 72 74 (Hotel Sport)
+ 48 6F 74 65 6C 20 47 69 6E 65 70 72 6F (Hotel Ginepro)
+ 53 70 61 69 6E (Spain)
+ 41 6C 70 20 32 35 30 30 (Alp 2500)
+ 48 6F 6C 69 64 61 79 20 43 65 6E 74 72 65 20 41 6C 62 65 72 67 75 65 (Holiday Centre Albergue)
+ 48 6F 74 65 6C 20 41 6C 70 20 4D 61 73 65 6C 6C 61 (Hotel Alp Masella)
+ 53 77 69 74 7A 65 72 6C 61 6E 64 (Switzerland)
+ 53 61 61 73 20 46 65 65 (Saas Fee)
+ 48 6F 74 65 6C 20 52 6F 64 61 6E 69 61 (Hotel Rodania)
+ 55 53 41 (USA)
+ 4B 69 6C 6C 69 6E 67 74 6F 6E (Killington)
+ 50 69 63 6F (Pico)
+ 53 74 6F 77 65 (Stowe)
+ 4D 6F 75 6E 74 20 53 6E 6F 77 (Mount Snow)
+ 53 75 6E 64 61 79 20 52 69 76 65 72 (Sunday River)
+ 53 75 67 61 72 6C 6F 61 66 (Sugarloaf)
+ 4C 6F 6F 6E (Loon)
+ 43 61 6E 6E 6F 6E (Cannon)
+ 57 61 74 65 72 76 69 6C 6C 65 20 56 61 6C 6C 65 79 (Waterville Valley)
+ 43 72 61 6E 6D 6F 72 65 (Cranmore)
+ 57 69 6C 64 63 61 74 (Wildcat)
+ 41 74 74 69 74 61 73 68 (Attitash)
+ 42 72 65 74 74 6F 6E 20 57 6F 6F 64 73 (Bretton Woods)
+ 57 69 6E 74 65 72 20 50 61 72 6B (Winter Park)
+ 41 6C 70 69 6E 65 20 4D 65 61 64 6F 77 73 (Alpine Meadows)
+ 48 6F 6D 65 77 6F 6F 64 (Homewood)
+ 48 65 61 76 65 6E 6C 79 (Heavenly)
+ 53 69 65 72 72 61 2D 61 74 2D 54 61 68 6F 65 (Sierra-at-Tahoe)
+ 4D 6F 75 6E 74 61 69 6E 20 49 6E 6E (Mountain Inn)
+ 43 6F 6D 66 6F 72 74 20 49 6E 6E 20 61 74 20 54 72 6F 6C 6C 65 79 20 53 71 75 61 72 65 (Comfort Inn at Trolley Square)
+ 47 72 65 79 20 42 6F 6E 6E 65 74 20 49 6E 6E (Grey Bonnet Inn)
+ 48 6F 6C 69 64 61 79 20 49 6E 6E (Holiday Inn)
+ 52 61 6D 61 64 61 20 49 6E 6E (Ramada Inn)
+ 52 65 64 20 52 6F 6F 66 20 49 6E 6E (Red Roof Inn)
+ 43 6F 6D 6D 6F 64 6F 72 65 73 20 49 6E 6E (Commodores Inn)
+ 4D 6F 75 6E 74 61 69 6E 65 65 72 20 49 6E 6E (Mountaineer Inn)
+ 54 68 65 20 4C 6F 64 67 65 20 61 74 20 4D 6F 75 6E 74 20 53 6E 6F 77 (The Lodge at Mount Snow)
+ 53 6E 6F 77 20 4C 61 6B 65 20 4C 6F 64 67 65 (Snow Lake Lodge)
+ 4A 6F 72 64 61 6E 20 47 72 61 6E 64 20 48 6F 74 65 6C (Jordan Grand Hotel)
+ 53 6E 6F 77 20 43 61 70 20 49 6E 6E 20 61 6E 64 20 53 6B 69 20 44 6F 72 6D (Snow Cap Inn and Ski Dorm)
+ 53 75 67 61 72 6C 6F 61 66 20 4D 6F 75 6E 74 61 69 6E 20 48 6F 74 65 6C (Sugarloaf Mountain Hotel)
+ 53 75 67 61 72 6C 6F 61 66 20 43 6F 6E 64 6F 73 (Sugarloaf Condos)
+ 53 75 67 61 72 6C 6F 61 66 20 49 6E 6E (Sugarloaf Inn)
+ 4E 6F 72 74 68 20 43 6F 6E 77 61 79 20 47 72 61 6E 64 (North Conway Grand)
+ 54 6F 77 6E 20 26 20 43 6F 75 6E 74 72 79 20 49 6E 6E (Town & Country Inn)
+ 56 61 6C 6C 65 79 20 49 6E 6E (Valley Inn)
+ 57 6F 6F 64 77 61 72 64 73 20 52 65 73 6F 72 74 (Woodwards Resort)
+ 42 65 61 63 6F 6E 20 52 65 73 6F 72 74 (Beacon Resort)
+ 42 65 61 76 65 72 20 56 69 6C 6C 61 67 65 20 43 6F 6E 64 6F 73 (Beaver Village Condos)
+ 56 69 6E 74 61 67 65 20 48 6F 74 65 6C (Vintage Hotel)
+ 46 65 72 72 61 72 69 73 20 43 72 6F 77 6E 20 52 65 73 6F 72 74 (Ferraris Crown Resort)
+ 47 72 61 6E 64 20 53 69 65 72 72 61 20 52 65 73 6F 72 74 20 26 20 43 61 73 69 6E 6F (Grand Sierra Resort & Casino)
+ 46 6F 72 65 73 74 20 53 75 69 74 65 73 20 52 65 73 6F 72 74 (Forest Suites Resort)
+ 51 75 61 6C 69 74 79 20 49 6E 6E 20 61 6E 64 20 53 75 69 74 65 73 (Quality Inn and Suites)
+ 43 6C 75 62 48 6F 74 65 6C 20 42 65 61 75 73 6F 6C 65 69 6C (ClubHotel Beausoleil)
+ 43 6C 75 62 48 6F 74 65 6C 20 4C 65 20 4D 6F 6E 74 20 43 6F 72 62 69 65 72 (ClubHotel Le Mont Corbier)
+ 43 6C 75 62 48 6F 74 65 6C 20 50 72 6F 76 65 6E E7 61 6C (ClubHotel Proven�al)
+ 43 6C 75 62 48 6F 74 65 6C 20 4C 65 73 20 52 6F 69 73 20 4D 61 67 65 73 (ClubHotel Les Rois Mages)
+ 43 6C 75 62 48 6F 74 65 6C 20 4C 65

1 Ответ

1 голос
/ 27 января 2012

Не решение, но невозможно в качестве комментария:
Пожалуйста, добавьте некоторый код отладки и добавьте вывод к исходному вопросу, чтобы мы могли видеть фактическое кодирование строк

<code><?php
$images = array (
    'Montgenèvre' => 'images/flags/small/france_sm.jpg',        
    'Jugendgastehaus Edthöf' => 'images/flags/small/austria_sm.jpg',    
    'Jugendgästehaus Wenghof' => 'images/flags/small/austria_sm.jpg',
    'Hotel Stadlmühle' => 'images/flags/small/austria_sm.jpg',
    'ClubHotel Provençal' => 'images/flags/small/france_sm.jpg'
);

// <-- debug code
function dbgString2Hex($s) {
    $rv = '';
    for($i=0; $i<strlen($s); $i++) {
        $rv .= sprintf('%02X ', ord($s[$i]));
    }
    return $rv;
}
echo "<pre>\n";
$dbgTitle = $this->item->title;
//$dbgTitle = 'Montgenèvre';
echo '- ', dbgString2Hex($dbgTitle), "($dbgTitle)\n";
foreach( $images as $dbgKey=>$dbgValue ) {
    echo '+ ', dbgString2Hex($dbgKey), "($dbgKey)\n";
}
echo "\n
"; // debugcode ->

update:
Вывод предполагает, что ваш файл php-скрипта не имеет кодировки utf-8, т.е. строковые литералы в вашем массиве $ images имеют кодировку iso-8859PHP (по крайней мере, в текущих версиях 5.x) выполняет побайтовое сравнение, нет понятия, что кодирование установлено отдельно от сравнения двух разных кодировок в ядре php (см. http://docs.php.net/mbstring).

Либо преобразуйте файл сценария в utf-8 и, таким образом, получите строковые литералы в кодировке utf-8 *.
Или (возможно, даже лучше) переместите эти строки в базу данных (например, с другой таблицей и запросите данные с помощьюнекоторые операторы JOIN).


*) Для многих символов в utf-8 имеется более одного представления. Поэтому простое сравнение байтов, подобное тому, как это было сделано для $x===$y в php, все равно может завершиться неудачей. Если выНадежный код, использующий функцию сравнения с поддержкой utf-8, должен быть обязательным.Вот почему я поместил эту логику в базу данных (а затем, вероятно, использовал другой дискриминатор, такой как, например, идентификатор категории, то есть что-то отличное от строки, может быть целое число или все, что система баз данных предлагает в качестве идентификатора).

...