PHP Conference Japan 2024

iconv

(PHP 4 >= 4.0.5,PHP 5,PHP 7,PHP 8)

iconv將字串從一種字元編碼轉換為另一種

說明

iconv(字串 $from_encoding, 字串 $to_encoding, 字串 $string): 字串|false

stringfrom_encoding 編碼轉換為 to_encoding 編碼。

參數

from_encoding

用於解讀 string 的目前編碼。

to_encoding

結果所需的編碼。

如果字串 //TRANSLIT 附加到 to_encoding,則會啟用轉寫。這表示當一個字元無法在目標字元集中表示時,它可能會透過一個或幾個看起來相似的字元來近似表示。如果附加了字串 //IGNORE,則無法在目標字元集中表示的字元將會被靜默地捨棄。否則,會產生 E_NOTICE 錯誤,並且函式將會返回 false

注意事項

//TRANSLIT 是否有效以及確切的運作方式取決於系統的 iconv() 實作 (參考 ICONV_IMPL)。已知某些實作會忽略 //TRANSLIT,因此對於 to_encoding 不允許的字元,轉換很可能會失敗。

string

要轉換的 字串

返回值

返回已轉換的字串,如果失敗則返回 false

範例

範例 #1 iconv() 範例

<?php
$text
= "This is the Euro symbol '€'.";

echo
'原始 : ', $text, PHP_EOL;
echo
'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo
'IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo
'Plain : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

?>

上述範例的輸出會類似如下:

Original : This is the Euro symbol '€'.
TRANSLIT : This is the Euro symbol 'EUR'.
IGNORE   : This is the Euro symbol ''.
Plain    :
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7

備註

注意事項:

可用的字元編碼和選項取決於已安裝的 iconv 實作。如果目前系統不支援 from_encodingto_encoding 的參數,將會返回 false

另請參閱

新增註釋

使用者貢獻的註釋 39 則註釋

Ritchie
17 年前
請注意,當 locale 類別 LC_CTYPE 設定為 C 或 POSIX 時,iconv('UTF-8', 'ASCII//TRANSLIT', ...) 無法正常運作。您必須選擇其他 locale,否則所有非 ASCII 字元將會被問號取代。至少在 glibc 2.5 的情況下是如此。

範例
<?php
setlocale
(LC_CTYPE, 'POSIX');
echo
iconv('UTF-8', 'ASCII//TRANSLIT', "Žluťoučký kůň\n");
// ?lu?ou?k? k??

setlocale(LC_CTYPE, 'cs_CZ');
echo
iconv('UTF-8', 'ASCII//TRANSLIT', "Žluťoučký kůň\n");
// Zlutoucky kun
?>
orrd101 at gmail dot com
12 年前
"//ignore" 選項不適用於最新版本的 iconv 函式庫。因此,如果您在使用該選項時遇到問題,您並不孤單。

這表示您目前無法使用此函式來過濾無效字元。相反地,它會靜默失敗並返回一個空字串(或者您會收到通知,但僅限於啟用 E_NOTICE 的情況下)。

自 2009 年以來,這一直是一個已知的錯誤,並且有已知的解決方案,但似乎沒有人願意修復它(PHP 必須將 -c 選項傳遞給 iconv)。截至最新版本 5.4.3,它仍然存在錯誤。

https://bugs.php.net/bug.php?id=48147
https://bugs.php.net/bug.php?id=52211
https://bugs.php.net/bug.php?id=61484

[更新日期:2012 年 6 月 15 日]
以下是一種解決方法...

ini_set('mbstring.substitute_character', "none");
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');

這將從 UTF-8 字串中去除無效字元(以便您可以將其插入資料庫等)。除了 "none" 之外,如果您希望它在無效字元的位置插入空格,也可以使用值 32。
daniel dot rhodes at warpasylum dot co dot uk
13 年前
有趣的是,設定不同的目標 locale 會導致不同但適當的音譯。例如

<?php
//一些德文
$utf8_sentence = 'Weiß, Goldmann, Göbel, Weiss, Göthe, Goethe und Götz';

//英國
setlocale(LC_ALL, 'en_GB');

//轉寫
$trans_sentence = iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_sentence);

//結果為 [Weiss, Goldmann, Gobel, Weiss, Gothe, Goethe und Gotz]
//這是我們原始字串被扁平化為 7 位元 ASCII 的結果,如同
//英語使用者會做的那樣(例如,簡單地移除變音符號)
echo $trans_sentence . PHP_EOL;

//德國
setlocale(LC_ALL, 'de_DE');

$trans_sentence = iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_sentence);

//結果為 [Weiss, Goldmann, Goebel, Weiss, Goethe, Goethe und Goetz]
//這正是德國人如果被迫使用 7 位元 ASCII 時,會如何轉寫這些
//帶變音符號的字元!
//(因為實際上 ä = ae,ö = oe,ü = ue)
echo $trans_sentence . PHP_EOL;

?>
annuaireehtp at gmail dot com
15 年前
用於測試不同字符集之間轉換的組合(當我們不知道來源字符集和方便的目標字符集時),這是一個例子

<?php
$tab
= array("UTF-8", "ASCII", "Windows-1252", "ISO-8859-15", "ISO-8859-1", "ISO-8859-6", "CP1256");
$chain = "";
foreach (
$tab as $i)
{
foreach (
$tab as $j)
{
$chain .= " $i$j ".iconv($i, $j, "$my_string");
}
}

echo
$chain;
?>

然後在顯示之後,您可以使用顯示良好的 $i$j。
注意:您可以將其他字符集添加到 $tab 以測試其他情況。
Daniel Klein
5 年前
如果您想轉換為沒有位元組順序標記 (BOM) 的 Unicode 編碼,請將位元組序添加到編碼中,例如,不要使用會在字串開頭添加 BOM 的 "UTF-16",而要使用會在不添加 BOM 的情況下轉換字串的 "UTF-16BE"。

例如:

<?php
iconv
('CP1252', 'UTF-16', $text); // 含 BOM
iconv('CP1252', 'UTF-16BE', $text); // 不含 BOM
zhawari at hotmail dot com
19 年前
以下是將 UCS-2 數字轉換為十六進位 UTF-8 數字的方法

<?php
function ucs2toutf8($str)
{
for (
$i=0;$i<strlen($str);$i+=4)
{
$substring1 = $str[$i].$str[$i+1];
$substring2 = $str[$i+2].$str[$i+3];

if (
$substring1 == "00")
{
$byte1 = "";
$byte2 = $substring2;
}
else
{
$substring = $substring1.$substring2;
$byte1 = dechex(192+(hexdec($substring)/64));
$byte2 = dechex(128+(hexdec($substring)%64));
}
$utf8 .= $byte1.$byte2;
}
return
$utf8;
}

echo
strtoupper(ucs2toutf8("06450631062D0020"));

?>

輸入
06450631062D
輸出
D985D8B1D8AD

此致,
Ziyad
jessiedeer at hotmail dot com
11 年前
帶有 //IGNORE 的 iconv 函式會按預期工作:如果字元在 $out_charset 編碼中不存在,它會跳過該字元。

如果 $in_charset 編碼中缺少某個字元(例如 CP1252 編碼中的位元組 \x81),則 iconv 將會返回錯誤,無論是否使用 //IGNORE。
manuel at kiessling dot net
15 年前
像許多其他人一樣,我在使用 iconv() 在編碼之間轉換(在我的例子中是從 UTF-8 到 ISO-8859-15)時,尤其是在大型字串上,遇到了很大的問題。

這裡的主要問題是,當你的字串包含非法的 UTF-8 字元時,沒有真正直接的方法來處理這些字元。 iconv() 在遇到有問題的字元時會簡單地(而且靜默地!)終止字串(即使使用 //IGNORE 也是如此),返回一個被截斷的字串。

<?php

$newstring
= html_entity_decode(htmlentities($oldstring, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-15');

?>

這裡和其他地方建議的解決方法在遇到非法字元時也會失效,至少會丟失一條有用的提示訊息(「htmlentities(): Invalid multibyte sequence in argument in...」(htmlentities(): 參數中出現無效的多位元組序列...))

我找到了很多提示、建議和替代方法(令人害怕的是,在我看來,PHP 原生提供這麼多種轉換字串編碼的方式並不是個好兆頭),但除了這個方法之外,其他方法都沒有真正起作用

<?php

$newstring
= mb_convert_encoding($oldstring, 'ISO-8859-15', 'UTF-8');

?>
jorortega at gmail dot com
11 年前
請注意,PHP 中的 iconv 使用系統的語系和語言實作,在 Linux 下可以運作的程式碼,通常在 Windows 下無法運作。

此外,您可能會注意到,最近版本的 Linux(Debian、Ubuntu、CentOS 等)的 //TRANSLIT 選項無法運作。因為大多數發行版預設不包含 intl 套件(例如:Debian 中的 php5-intl 和 icuxx(其中 xx 是一個數字))。這是因為 intl 套件與另一個國際 DNS 解析所需的套件衝突。

問題是,配置取決於您託管的機器上的系統管理員,因此 iconv 預設情況下幾乎毫無用處,具體取決於您的發行版或機器管理員使用的配置。
Leigh Morresi
16 年前
如果在音譯時 iconv 輸出中出現問號,請確保將「setlocale」設定為您的系統支援的語系。

某些 PHP CMS 會將 setlocale 預設設定為「C」,這可能會造成問題。

使用「locale」指令來查詢列表…

$ locale -a
C
en_AU.utf8
POSIX

<?php
setlocale
(LC_CTYPE, 'en_AU.utf8');
$str = iconv('UTF-8', 'ASCII//TRANSLIT', "Côte d'Ivoire");
?>
nikolai-dot-zujev-at-gmail-dot-com
20 年前
以下是如何將 windows-1251(Windows)或 cp1251(Linux/Unix)編碼的字串轉換為 UTF-8 編碼的範例。

<?php
函式 cp1251_utf8( $sInput )
{
$sOutput = "";

for (
$i = 0; $i < strlen( $sInput ); $i++ )
{
$iAscii = ord( $sInput[$i] );

if (
$iAscii >= 192 && $iAscii <= 255 )
$sOutput .= "&#".( 1040 + ( $iAscii - 192 ) ).";";
elseif (
$iAscii == 168 )
$sOutput .= "&#".( 1025 ).";";
elseif (
$iAscii == 184 )
$sOutput .= "&#".( 1105 ).";";
else
$sOutput .= $sInput[$i];
}

return
$sOutput;
}
?>
gree:.. (gree 4T grees D0T net)
17 年前
在我的情況下,我必須將
<?php
setlocale
(LC_CTYPE, 'cs_CZ');
?>
改成
<?php
setlocale
(LC_CTYPE, 'cs_CZ.UTF-8');
?>
否則它會返回問號。

當我用 locale 指令查詢我的 Linux 語系設定時,它返回 "cs_CZ.UTF-8",所以這之間可能有關聯。

iconv (GNU libc) 2.6.1
glibc 2.3.6
atelier at degoy dot com
10 年前
有些情況下,一個使用 UTF-8 編碼的新版網站,必須顯示資料庫中一些仍然使用 ISO-8859-1 編碼的舊資料。問題是如果 $string 已經是 UTF-8 編碼,就不應該使用 iconv("ISO-8859-1", "UTF-8", $string)。

我使用這個不需要任何擴充功能的函式

function convert_utf8( $string ) {
if ( strlen(utf8_decode($string)) == strlen($string) ) {
// $string 不是 UTF-8
return iconv("ISO-8859-1", "UTF-8", $string);
} else {
// 已經是 UTF-8
return $string;
}
}

我沒有對它進行廣泛的測試,希望它能有所幫助。
anton dot vakulchik at gmail dot com
16 年前
函式 detectUTF8($string)
{
return preg_match('%(?
[\\xC2-\\xDF][\\x80-\\xBF] # 非超長雙位元組
|\\xE0[\\xA0-\\xBF][\\x80-\\xBF] # 排除超長編碼
|[\\xE1-\\xEC\\xEE\\xEF][\\x80-\\xBF]{2} # 標準三位元組
|\\xED[\\x80-\\x9F][\\x80-\\xBF] # 排除代理對編碼
|\\xF0[\\x90-\\xBF][\\x80-\\xBF]{2} # 平面 1-3
|[\\xF1-\\xF3][\\x80-\\xBF]{3} # 平面 4-15
|\\xF4[\\x80-\\x8F][\\x80-\\xBF]{2} # 平面 16
)+%xs', $string);
}

function cp1251_utf8( $sInput )
{
$sOutput = "";

for ( $i = 0; $i < strlen( $sInput ); $i++ )
{
$iAscii = ord( $sInput[$i] );

if ( $iAscii >= 192 && $iAscii <= 255 )
$sOutput .= "&#".( 1040 + ( $iAscii - 192 ) ).";";
else if ( $iAscii == 168 )
$sOutput .= "&#".( 1025 ).";";
else if ( $iAscii == 184 )
$sOutput .= "&#".( 1105 ).";";
else
$sOutput .= $sInput[$i];
}

return $sOutput;
}

function encoding($string){
if (function_exists('iconv')) {
if (@!iconv('utf-8', 'cp1251', $string)) {
$string = iconv('cp1251', 'utf-8', $string);
}
return $string;
} else {
if (detectUTF8($string)) {
return $string;
} else {
return cp1251_utf8($string);
}
}
}
echo encoding($string);
phpnet at dariosulser dot ch
5 年前
ANSI = Windows-1252 = CP1252
所以 UTF-8 -> ANSI

<?php
$string
= "Winkel γ=200 für 1€"; //"γ"=HTML:&gamma;
$result = iconv('UTF-8', 'CP1252//IGNORE', $string);
echo
$result;
?>

註解1
<?php
$string
= "Winkel γ=200 für 1€";
$result = iconv('UTF-8', 'CP1252', $string);
echo
$result; //"conv(): 偵測到輸入字串中有不合法的字元"
?>

註解2 (ANSI 比 ISO 8859-1 (ISO-8859-1==Latin-1) 解碼更好)
<?php
$string
= "Winkel γ=200 für 1€";
$result = utf8_decode($string);
echo
$result; //"Winkel ?=200 für 1?"
?>

註解3 網站使用語言的比例
93.0% = UTF-8;
3.5% = Latin-1;
0.6% = ANSI <----- 你應該使用這個 (如果你的網頁是中文或是有數學符號,則使用 utf-8)
ameten
13 年前
我使用了 iconv 將 cp1251 轉換成 UTF-8。我花了一天時間調查為什麼一個以俄文大寫字母 'Р' (發音類似 'r') 結尾的字串無法插入資料庫。

問題不在 iconv。cp1251 編碼的 'Р' 是 chr(208),UTF-8 編碼的 'Р' 則是 chr(208).chr(106)。chr(106) 是一個空白字元,符合正規表達式中的 '\s'。因此,它可能會被貪婪的 '+' 或 '*' 運算子吃掉。在這種情況下,你的字串就會遺失 'Р'。

例如,'ГР ' (俄文,UTF-8 編碼)。使用 preg_match 函數,正規表達式為 '(.+?)[\s]*'。則 '(.+?)' 會匹配 'Г'.chr(208),而 '[\s]*' 會匹配 chr(106).' '。

雖然這不是 iconv 的錯誤,但看起來很像。這就是為什麼我在這裡留下這則評論。
nilcolor at gmail dot coom
19 年前
不知道這算不算是一個功能,但對我來說有效 (PHP 5.0.4)

iconv('', 'UTF-8', $str)

用它來將 windows-1251(儲存在資料庫中)轉換為 UTF-8(我用於網頁)。
順帶一提,我用 array_walk_recursive… 來轉換我從資料庫中提取的每個陣列。
jessie at hotmail dot com
11 年前
如果輸入編碼的字元串中沒有無效的程式碼點,//IGNORE 選項會如預期般運作。這裡沒有錯誤。
Nopius
9 年前
正如 orrd101 所說,在最近的 PHP 版本 (我們使用 5.6.5) 中,//IGNORE 有一個錯誤,我們無法轉換某些字串(例如,使用 //IGNORE 將 "∙" 從 UTF8 轉換為 CP1251)。
但我們找到了一個解決方法,現在我們同時使用 //TRANSLIT 和 //IGNORE 旗標
$text="∙";
iconv("UTF8", "CP1251//TRANSLIT//IGNORE", $text);
ng4rrjanbiah at rediffmail dot com
20 年前
以下是不使用 iconv 將 ISO 8859-1 轉換為 UTF-8 及反向轉換的程式碼。

<?php
//邏輯來自 http://twiki.org/cgi-bin/view/Codev/InternationalisationUTF8
$str_iso8859_1 = 'foo in ISO 8859-1';
//ISO 8859-1 轉 UTF-8
$str_utf8 = preg_replace("/([\x80-\xFF])/e",
"chr(0xC0|ord('\\1')>>6).chr(0x80|ord('\\1')&0x3F)",
$str_iso8859_1);
//UTF-8 轉 ISO 8859-1
$str_iso8859_1 = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e",
"chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)",
$str_utf8);
?>

希望有幫助,
R. Rajesh Jeba Anbiah
rasmus at mindplay dot dk
10 年前
請注意 iconv() 和 mb_convert_encoding() 之間的一個重要區別 - 如果你處理的是字串而不是檔案,你很可能需要 mb_convert_encoding() 而不是 iconv(),因為 iconv() 會在例如從 ISO-8859-1 轉換為 UTF-32 字串時,在字串的開頭添加位元組順序標記,這可能會影響你後續對結果字串的所有計算和操作。

換句話說,iconv() 似乎是用於轉換檔案內容的 - 而 mb_convert_encoding() 則是用於在內部處理字串,例如,不是從檔案讀取/寫入,而是與其他媒體交換的字串。
zhawari at hotmail dot com
19 年前
以下是如何將 UTF-8 數字轉換為十六進位制的 UCS-2 數字

<?php

函式 utf8toucs2($str)
{
for (
$i=0;$i<strlen($str);$i+=2)
{
$substring1 = $str[$i].$str[$i+1];
$substring2 = $str[$i+2].$str[$i+3];

if (
hexdec($substring1) < 127)
$results = "00".$str[$i].$str[$i+1];
else
{
$results = dechex((hexdec($substring1)-192)*64 + (hexdec($substring2)-128));
if (
$results < 1000) $results = "0".$results;
$i+=2;
}
$ucs2 .= $results;
}
return
$ucs2;
}

echo
strtoupper(utf8toucs2("D985D8B1D8AD"))."\n";
echo
strtoupper(utf8toucs2("456725"))."\n";

?>

輸入
D985D8B1D8AD
輸出
06450631062D

輸入
456725
輸出
004500670025
vitek at 4rome dot ru
20 年前
在某些系統上可能沒有 iconv() 這個函式;這是因為以下原因:定義了一個名為 `iconv` 的常數,其值為 `libiconv`。因此,字串 PHP_FUNCTION(iconv) 會轉換為 PHP_FUNCTION(libiconv),您必須呼叫 libiconv() 函式而不是 iconv()。
我在 FreeBSD 上看過這種情況,但我確定那是一個相當特殊的版本。
如果您不想依賴這種行為,請將以下內容添加到您的腳本中
<?php
if (!function_exists('iconv') && function_exists('libiconv')) {
function
iconv($input_encoding, $output_encoding, $string) {
return
libiconv($input_encoding, $output_encoding, $string);
}
}
?>
感謝 tony2001 at phpclub.net 解釋這種行為。
mightye at gmail dot com
17 年前
要從輸入中去除無效字元(例如來自未經處理或其他無法保證一定會根據其宣稱的編碼集提供已編碼字串的來源的資料),請使用相同的字元集作為輸入和輸出,並在輸出字元集上使用 //IGNORE。
<?php
// 假設 '†' 實際上是 UTF8,由於我們沒有在 htmlentities 的第三個參數中指定,htmlentities 會假設它是 iso-8859。
// 這會產生 "&acirc;[錯誤的 utf-8 字元]"
// 如果傳遞給任何 libxml,它會產生致命錯誤。
$badUTF8 = htmlentities('†');

// iconv() 可以忽略無法以目標字元集編碼的字元
$goodUTF8 = iconv("utf-8", "utf-8//IGNORE", $badUTF8);
?>
範例的結果並不會返回原始輸入的劍號字元(它在 htmlentities 被誤用而錯誤編碼時遺失了,儘管這對於不習慣處理擴展字元集的人來說很常見),但它至少會提供在目標字元集中有效的資料。
Daniel Klein
8 年前
我今天才發現 Windows 和 *NIX 版本的 PHP 使用不同的 iconv 函式庫,彼此之間不太一致。

以下是我先前程式碼的重新發布,現在可以在更多系統上運作。它會盡可能地轉換,並將其餘部分替換為問號

<?php
if (!function_exists('utf8_to_ascii')) {
setlocale(LC_CTYPE, 'en_AU.utf8');
if (@
iconv("UTF-8", "ASCII//IGNORE//TRANSLIT", 'é') === false) {
// PHP 可能使用的是 glibc 函式庫 (*NIX 系統)
function utf8_to_ascii($text) {
return
iconv("UTF-8", "ASCII//TRANSLIT", $text);
}
}
else {
// PHP 可能使用的是 libiconv 函式庫 (Windows 系統)
function utf8_to_ascii($text) {
if (
is_string($text)) {
// 包含呈現為單一字形的字元組合
$text = preg_replace_callback('/\X/u', __FUNCTION__, $text);
}
elseif (
is_array($text) && count($text) == 1 && is_string($text[0])) {
// 忽略無法轉換為 ASCII 的字元
$text = iconv("UTF-8", "ASCII//IGNORE//TRANSLIT", $text[0]);
// 文件說明 iconv() 在失敗時會返回 false,但實際上返回的是 ''
if ($text === '' || !is_string($text)) {
$text = '?';
}
elseif (
preg_match('/\w/', $text)) { // 如果文字包含任何字母...
$text = preg_replace('/\W+/', '', $text); // ...則移除所有非字母字元
}
}
else {
// $text 不是字串
$text = '';
}
return
$text;
}
}
}
anyean at gmail dot com
19 年前
<?php
// 來自 http://zizi.kxup.com/ 的腳本
// JavaScript unescape
function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
$ar = $r[0];
print_r($ar);
foreach(
$ar as $k=>$v) {
if(
substr($v,0,2) == "%u")
$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
elseif(
substr($v,0,3) == "&#x")
$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
elseif(
substr($v,0,2) == "&#") {
echo
substr($v,2,-1)."<br>";
$ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
}
}
return
join("",$ar);
}
?>
kikke
15 年前
如果其他方法都失敗了,你可以在 Linux 中透過 passthru 使用原生 iconv。
使用 -c 參數來抑制錯誤訊息。
phpmanualspam at netebb dot com
15 年前
mirek 的程式碼,日期為 2008 年 5 月 16 日 10:17,在輸出中添加了 `^~' " 字元。
這個函式會去除這些額外的字元。
<?php
setlocale
(LC_ALL, 'en_US.UTF8');
function
clearUTF($s)
{
$r = '';
$s1 = @iconv('UTF-8', 'ASCII//TRANSLIT', $s);
$j = 0;
for (
$i = 0; $i < strlen($s1); $i++) {
$ch1 = $s1[$i];
$ch2 = @mb_substr($s, $j++, 1, 'UTF-8');
if (
strstr('`^~\'"', $ch1) !== false) {
if (
$ch1 <> $ch2) {
--
$j;
continue;
}
}
$r .= ($ch1=='?') ? $ch2 : $ch1;
}
return
$r;
}
?>
Daniel Klein
11 年前
您可以使用 'CP1252' 取代 'Windows-1252'
<?php
// 這兩行是等效的
$result = iconv('Windows-1252', 'UTF-8', $string);
$result = iconv('CP1252', 'UTF-8', $string);
?>
注意:以下程式碼點在 CP1252 中無效,將會導致錯誤。
129 (0x81)
141 (0x8D)
143 (0x8F)
144 (0x90)
157 (0x9D)
請改用以下方式
<?php
// 移除無效的程式碼點,轉換其他所有內容
$result = iconv('CP1252', 'UTF-8//IGNORE', $string);
?>
chicopeste at gmail dot com
11 年前
iconv 也支援 CP850。
我使用 iconv("CP850", "UTF-8//TRANSLIT", $var);
將 SQL_Latin1_General_CP850_CI_AI 轉換為 UTF-8。
Locoluis
18 年前
以下是基於 ISO-8859 但添加了那些愚蠢控制字元的 Microsoft 編碼。

CP1250 是東歐語系(不是 ISO-8859-2)
CP1251 是斯拉夫語系(不是 ISO-8859-5)
CP1252 是西歐語系(不是 ISO-8859-1)
CP1253 是希臘語系(不是 ISO-8859-7)
CP1254 是土耳其語系(不是 ISO-8859-9)
CP1255 是希伯來語系(不是 ISO-8859-8)
CP1256 是阿拉伯語系(不是 ISO-8859-6)
CP1257 是波羅的海語系(不是 ISO-8859-4)

如果您知道輸入來自使用這些編碼的 Windows 電腦,請使用其中一種作為 iconv 的參數。
匿名
14 年前
對於包含特殊字元 (é) &eacute; 的文字,它在 ISO-8859-1 中的編碼為 0xE9,在 IBM-850 中的編碼為 0x82。 正確的輸出字元集是 'IBM850',因為
('ISO-8859-1', 'IBM850', 'Québec')
Andries Seutens
15 年前
在進行字元轉換時,您必須確保 LC_COLLATE 設定正確,否則將使用預設的 POSIX。

要將 "rené" 轉換為 "rene",我們可以使用以下程式碼片段

<?php

setlocale
(LC_CTYPE, 'nl_BE.utf8');

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

echo
$string; // 輸出 rene

?>
vb (at) bertola.eu
14 年前
在我的系統上,根據測試,以及其他人在其他地方的報告,您可以透過附加以下內容來組合 TRANSLIT 和 IGNORE

//IGNORE//TRANSLIT

嚴格按照此順序,但不能附加 //TRANSLIT//IGNORE,這將導致 //IGNORE 被忽略 ( :) )。

無論如何,很難理解如何設計一個傳遞選項的系統,卻不允許以簡潔的方式結合這兩個選項,也很難理解為什麼預設行為應該是效用最小且最危險的行為(在第一個非預期字元出現時丟棄大部分資料)。軟體設計失敗 :-/
berserk220 at mail dot ru
16 年前
因此,由於 iconv() 並非總是正常工作,在大多數情況下,使用 htmlentities() 要容易得多。
範例:<?php $content=htmlentities(file_get_contents("incoming.txt"), ENT_QUOTES, "Windows-1252"); file_put_contents("outbound.txt", html_entity_decode($content, ENT_QUOTES , "utf-8")); ?>
mirek at burkon dot org
16 年前
如果您需要從 UTF-8 中去除盡可能多的特殊字元,並保持其餘輸入不變(例如,將可以轉換為 ASCII 的任何內容進行轉換,並保留其餘部分),您可以這樣做

<?php
setlocale
(LC_ALL, 'en_US.UTF8');

function
clearUTF($s)
{
$r = '';
$s1 = iconv('UTF-8', 'ASCII//TRANSLIT', $s);
for (
$i = 0; $i < strlen($s1); $i++)
{
$ch1 = $s1[$i];
$ch2 = mb_substr($s, $i, 1);

$r .= $ch1=='?'?$ch2:$ch1;
}
return
$r;
}

echo
clearUTF('Šíleně žluťoučký Vašek úpěl olol! This will remain untranslated: ᾡᾧῘઍિ૮');
// 輸出 Silene zlutoucky Vasek upel olol! This will remain untranslated: ᾡᾧῘઍિ૮
?>

請記住,您**必須**將地區設定設為某種 Unicode 編碼,才能讓 iconv 正確處理 //TRANSLIT!
admin at iecw dot net
11 年前
如果您想在 Mac OS X 上標準化檔名,因為它是 UTF-8 NFD 格式,而您需要 UTF-8 NFC 格式
(請參閱:http://en.wikipedia.org/wiki/Unicode_equivalence#Combining_and_precomposed_characters
您可以使用
<?php
$filename_nfc
= iconv("UTF-8-MAC", "UTF-8", $filename_nfd);
?>
aissam at yahoo dot com
20 年前
對於在瀏覽器上顯示 UCS-2 資料有問題的人,這裡有一個簡單的函式,可以將 ucs2 轉換為 html unicode 實體

<?php

函式 ucs2html($str) {
$str=trim($str); // 如果您是從檔案讀取
$len=strlen($str);
$html='';
for(
$i=0;$i<$len;$i+=2)
$html.='&#'.hexdec(dechex(ord($str[$i+1])).
sprintf("%02s",dechex(ord($str[$i])))).';';
return(
$html);
}
?>
martin at front of mind dot co dot uk
15 年前
用於轉碼 Excel 產生的 CSV 值,以下方法似乎可行

<?php
$value
= iconv('Windows-1252', 'UTF-8//TRANSLIT', $value);
?>
To Top