PHP 日本会议 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
'Original : ', $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 年前
请注意,当区域设置类别 LC_CTYPE 设置为 C 或 POSIX 时,iconv('UTF-8', 'ASCII//TRANSLIT', ...) 无法正常工作。您必须选择其他区域设置,否则所有非 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 字符串中去除无效字符(以便您可以将其插入数据库等)。您可以使用值 32 代替 "none",如果您想用空格代替无效字符。
daniel dot rhodes at warpasylum dot co dot uk
13 年前
有趣的是,设置不同的目标区域设置会导致不同的、但适当的转写。例如

<?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”,而应使用“UTF-16BE”,它会在不添加 BOM 的情况下转换字符串。

例如:

<?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),则无论是否使用 //IGNORE,iconv 都会返回错误。
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...”)

我发现了很多提示、建议和替代方法(这很可怕,在我看来,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
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;
}
?>
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年前
function detectUTF8($string)
{
return preg_match('%(?
[\xC2-\xDF][\x80-\xBF] # 非超长 2 字节
|\xE0[\xA0-\xBF][\x80-\xBF] # 排除超长字符
|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # 直接 3 字节
|\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(): Detected an illegal character in input string"
?>

注释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 存在一个错误,我们无法转换某些字符串(例如,将 UTF8 中的“∙”转换为 CP1251 使用 //IGNORE)。
但是我们找到了一种解决方法,现在我们同时使用 //TRANSLIT 和 //IGNORE 标志
$text="∙";
iconv("UTF8", "CP1251//TRANSLIT//IGNORE", $text);
ng4rrjanbiah at rediffmail dot com
20年前
这是一段代码,用于在不使用 iconv 的情况下将 ISO 8859-1 转换为 UTF-8,反之亦然。

<?php
//Logic from http://twiki.org/cgi-bin/view/Codev/InternationalisationUTF8
$str_iso8859_1 = 'foo in ISO 8859-1';
//ISO 8859-1 to UTF-8
$str_utf8 = preg_replace("/([\x80-\xFF])/e",
"chr(0xC0|ord('\\1')>>6).chr(0x80|ord('\\1')&0x3F)",
$str_iso8859_1);
//UTF-8 to 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

function 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);
}
}
?>
感谢 phpclub.net 上的 tony2001 解释了这种行为。
mightye at gmail dot com
17 年前
要从输入中去除无效字符(例如来自未经消毒或其他来源的数据,您不能保证这些数据一定按照其公布的编码集进行编码),请使用相同的字符集作为输入和输出,并在输出字符集上使用 //IGNORE。
<?php
// 假设 '†' 实际上是 UTF8,htmlentities 将假设它是 iso-8859
// 因为我们没有在 htmlentities 的第三个参数中指定。
// 这将生成 "&acirc;[bad utf-8 character]"
// 如果传递给任何 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 不安全
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系统自带的iconv函数,通过passthru函数调用。
使用 -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 的参数。
Anonymous
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!
iecw dot net
11年前
如果您想规范化 macOS 上的文件名,因为它使用 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

function 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