2011-01-25 10 views
24

Nadal nie rozumiem, jak działa iconv.PHP: Radzenie sobie ze znakami specjalnymi z iconv

Na przykład

$string = "Löic & René"; 
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 

otrzymuję,

Wskazówka: iconv() [function.iconv]: wykryto niedozwolony znak w ciąg wejściowy w ...

$string = "Löic"; lub $string = "René";

otrzymuję,

Wskazówka:. iconv() [function.iconv]: Wykryto niepełny charakter wielobajtowy w ciągu wejściowego w

mogę nic z $string = "&";

Istnieją dwa zestawy różnych wyjść muszę przechowywać je w dwóch różnych kolumny wewnątrz tabeli mojej bazy danych,

  1. muszę konwertować Löic & René do Loic & Rene dla czystej url pu zagraża.

  2. muszę utrzymać je, ponieważ są one - jak Löic & RenéLöic & René następnie konwertować je htmlentities($string, ENT_QUOTES); podczas wyświetlania ich na mojej stronie html.

Próbowałem z kilkoma sugestiami w php.net poniżej, ale nadal nie działają,

miałem sytuację, gdzie potrzebne niektóre znaki w transliteracji, ale inni ignorowane (dla dziwnych znaków diakrytycznych, takich jak Ayn lub hamza). Dodawanie // TRANSLIT // IGNORE wydawało mi się, że to dla mnie wystarczające. To transliteruje wszystko, co może być transliterowane, ale potem wyrzuca rzeczy, które nie mogą być.

Więc:

$string = "ʿABBĀSĀBĀD"; 

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string); 
// output: [nothing, and you get a notice] 

echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string); 
// output: ABBSBD 

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string); 
// output: ABBASABAD 
// Yay! That's what I wanted! 

a inny,

Andries Seutens 07-Nov-2009 07:38 
When doing transliteration, you have to make sure that your LC_COLLATE is properly set, otherwise the default POSIX will be used. 

To transform "rené" into "rene" we could use the following code snippet: 
setlocale(LC_CTYPE, 'nl_BE.utf8'); 

$string = 'rené'; 
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); 

echo $string; // outputs rene 

Jak mogę faktycznie pracują je?

Dzięki.

EDIT:

Jest to plik źródłowy przetestować kod,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<?php 
$string = "Löic & René"; 
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
?> 
</html> 
+0

BTW: czy zdajesz sobie sprawę, że 'ö' &' é' są w ISO-8859-1?Oprócz niewłaściwego zestawu znaków wejściowych, możesz zmienić swój zestaw znaków wyjściowych na 'ASCII // TRANSLIT'. – Wrikken

+7

Jestem tak zdezorientowany tymi zestawami znaków ... – laukok

+1

Dzięki! Musiałem rozszyfrować niektóre znaki koreańskie do UTF-8 i to był prawdziwy ból głowy - ostatecznie jedyne, co pomogło, to: '$ convert = iconv ('EUC-KR', 'UTF-8 // TRANSLIT', $ data); ' – ShayLivyatan

Odpowiedz

12

A czy zapisać plik źródłowy w UTF-8? Jeśli nie (i domyślam się, że nie, ponieważ spowoduje to błąd "niekompletnego znaku wielobajtowego"), spróbuj najpierw.

+0

Najprawdopodobniej odpowiedź (lub jeśli łańcuchy nie pochodzą z pliku/a, niepoprawny zestaw znaków dla dowolnego źródła (db, http itp.) danych. Jedno jest pewne: dane wejściowe nie jest utf-8, – Wrikken

+0

@wimvds: dziękuję, w jaki sposób mogę zapisać mój plik źródłowy w kodowaniu UTF-8? Zobacz moją edycję powyżej - Mam utf-8 w meta - czy to jest poprawne? – laukok

+0

@lauthiamkok: Jeśli nadal testujesz powyższe przykłady, użyj dobrego edytora/IDE, który pozwala ci wybrać kodowanie pliku (tj. Notepad ++ w systemie Windows, Eclipse/NetBeans na dowolnym dużym systemie operacyjnym) Do wprowadzania ze stron internetowych należy użyć metatagów lub odpowiednich wywołań Header (lub najlepiej obu)) i podczas korzystania z MySQL, upewnij się, że otworzysz go również w trybie UTF-8 ('SET NAMES 'utf-8''). – wimvds

18
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($s)); 
+3

+1, 'utf8_encode()' sam działał dobrze dla mnie, dzięki! – John

+8

Należy zauważyć, że 'utf8_encode()' konwertuje tylko ISO-8859-1 na UTF-8 –

+1

Świetny fragment. Napotkano powiadomienie podczas konwersji nazw plików i to rozwiązanie rozwiązało mój problem w sposób brzydki. – Giorgio

Powiązane problemy