iconv

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

iconv将字符串从一种字符编码转换为另一种

说明

iconv(string $from_encoding, string $to_encoding, string $string): 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

要转换的 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 个注释

82
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
?>
77
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

[更新 15-JUN-2012]
以下是一个解决方法...

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

这将从 UTF-8 字符串中删除无效字符(这样您就可以将其插入到数据库中,等等)。除了 "none" 之外,您也可以使用值 32,如果您想在无效字符的位置插入空格。
56
daniel dot rhodes at warpasylum dot co dot uk
12 年前
有趣的是,设置不同的目标区域设置会产生不同的但适当的音译。例如

<?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;

?>
51
annuaireehtp at gmail dot com
14 年前
为了测试字符集之间转换的不同组合(当我们不知道源字符集以及什么是方便的目标字符集时),这是一个示例

<?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 中以测试其他情况。
6
Daniel Klein
4 年前
如果您想将字符串转换为没有字节顺序标记 (BOM) 的 Unicode 编码,请将字节序添加到编码中,例如,不要使用会将 BOM 添加到字符串开头的 "UTF-16",而是使用 "UTF-16BE",它将转换字符串而不会添加 BOM。

例如:

<?php
iconv
('CP1252', 'UTF-16', $text); // 带 BOM
iconv('CP1252', 'UTF-16BE', $text); // 不带 BOM
19
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');

?>
15
Leigh Morresi
15 年前
如果您在音译时在 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");
?>
8
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
7
jessiedeer at hotmail dot com
11 年前
带有 //IGNORE 的 iconv 按预期工作:如果字符在 $out_charset 编码中不存在,它会跳过该字符。

如果字符在 $in_charset 编码中丢失(例如 CP1252 编码中的字节 \x81),那么 iconv 将返回错误,无论是否使用 //IGNORE。
6
jorortega at gmail dot com
10 年前
请注意,PHP 中的 iconv 使用了系统的语言环境和语言实现,在 Linux 上有效的通常在 Windows 上无效。

此外,您可能会注意到,在最近版本的 Linux(Debian、Ubuntu、CentOS 等)中,//TRANSLIT 选项不起作用。因为大多数发行版默认情况下不包含 intl 软件包(例如:Debian 中的 php5-intl 和 icuxx(其中 xx 是一个数字))。这是因为 intl 软件包与国际 DNS 解析所需的另一个软件包冲突。

问题是配置取决于您托管机器的系统管理员,因此 iconv 默认情况下几乎毫无用处,具体取决于您的发行版或机器管理员使用的配置。
6
vitek at 4rome dot ru
19 年前
在某些系统上可能不存在 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 对这种行为的解释。
7
nikolai-dot-zujev-at-gmail-dot-com
19 年前
以下是如何将 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;
}
?>
9
gree:.. (gree 4T grees D0T net)
16 年前
在我的情况下,我不得不更改
<?php
setlocale
(LC_CTYPE, 'cs_CZ');
?>
to
<?php
setlocale
(LC_CTYPE, 'cs_CZ.UTF-8');
?>
否则它会返回问号。

当我询问我的 Linux 本地化(通过 locale 命令)时,它返回“cs_CZ.UTF-8”,因此它们之间可能存在关联关系。

iconv (GNU libc) 2.6.1
glibc 2.3.6
15
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 的错误,但它看起来非常像。这就是我在这里放置此评论的原因。
3
phpnet at dariosulser dot ch
4 年前
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)
5
anton dot vakulchik at gmail dot com
16 年前
函数 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);
}

函数 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;
}

函数 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);
9
atelier at degoy dot com
9 年前
可能存在以下情况:一个新的网站版本(全部使用 UTF-8)必须显示数据库中剩余的一些旧数据(包含 ISO-8859-1 重音)。问题是,如果 $string 已经使用 UTF-8 编码,则不应该应用 iconv("ISO-8859-1", "UTF-8", $string)。

我使用这个函数,它不需要任何扩展

函数 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;
}
}

我还没有对其进行广泛测试,希望它可能有所帮助。
7
nilcolor at gmail dot coom
18 年前
不知道这是一个特性还是不是,但它对我有用(PHP 5.0.4)

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

测试它以将 windows-1251(存储在 DB 中)转换为 UTF-8(我用于网页)。
顺便说一下,我使用 array_walk_recursive... 将从 DB 中获取的每个数组进行转换。
8
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
8
Nopius
9 年前
正如 orrd101 所说,在最近的 PHP 版本(我们使用 5.6.5)中存在一个使用 //IGNORE 的错误,我们无法转换一些字符串(例如,从 UTF8 到 CP1251 使用 //IGNORE 的“∙”)。
但我们找到了一个解决方法,现在我们同时使用 //TRANSLIT 和 //IGNORE 标志
$text="∙";
iconv("UTF8", "CP1251//TRANSLIT//IGNORE", $text);
3
jessie at hotmail dot com
11 年前
假设输入编码的字符链中没有无效代码点,则 //IGNORE 选项按预期工作。这里没有错误。
5
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
3
rasmus at mindplay dot dk
10 年前
请注意,iconv() 和 mb_convert_encoding() 之间存在一个重要区别 - 如果您正在处理字符串而不是文件,那么您很可能需要 mb_convert_encoding() 而不是 iconv(),因为 iconv() 会在从例如 ISO-8859-1 转换时向(例如)UTF-32 字符串的开头添加一个字节顺序标记,这可能会使您随后对结果字符串进行的所有计算和操作失效。

换句话说,iconv() 似乎旨在用于转换文件的内容 - 而 mb_convert_encoding() 旨在用于在内部处理字符串,例如,字符串不是读/写到/从文件,而是与其他媒体交换。
2
mightye at gmail dot com
16 年前
要从输入中去除无效字符(例如来自未经清理或其他来源的数据,您不能信任这些数据以其广告的编码集对字符串进行编码),请使用与输入和输出相同的字符集,并在输出字符集中使用 //IGNORE。
<?php
// 假设 '†' 实际上是 UTF8,htmlentities 会假设它是 iso-8859
// 因为我们在 htmlentities 的第三个参数中没有指定。
// 这会生成 "&acirc;[无效的 utf-8 字符]"
// 如果传递给任何 libxml,它将生成一个致命错误。
$badUTF8 = htmlentities('†');

// iconv() 可以忽略无法在目标字符集中编码的字符
$goodUTF8 = iconv("utf-8", "utf-8//IGNORE", $badUTF8);
?>
此示例的结果不会将原始输入的匕首字符返回给你(它在 htmlentities 被错误地用于对其进行编码时丢失了,尽管这是不习惯处理扩展字符集的人们的常见问题),但它至少会提供目标字符集中合理的数据。
3
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;
}
}
}
3
anyean at gmail dot com
19 年前
<?php
// 来自 http://zizi.kxup.com/ 的脚本
// javascript unesape
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);
}
?>
3
kikke
15 年前
如果所有方法都失败,你可以通过 passthru 在 Linux 中使用原生 iconv。
使用 -c 参数来抑制错误消息。
2
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);
?>
1
chicopeste at gmail dot com
10 年前
iconv 也支持 CP850。
我使用 iconv("CP850", "UTF-8//TRANSLIT", $var);
将 SQL_Latin1_General_CP850_CI_AI 转换为 UTF-8。
4
Locoluis
17 年前
以下是基于 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。
2
phpmanualspam at netebb dot com
14 年前
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;
}
?>
1
匿名
14 年前
对于包含特殊字符的文本,例如 (é) &eacute;,它在 ISO-8859-1 中以 0xE9 出现,在 IBM-850 中以 0x82 出现。正确的输出字符集是 'IBM850',因为
('ISO-8859-1', 'IBM850', 'Québec')
1
Andries Seutens
14 年前
在进行音译时,您必须确保您的 LC_COLLATE 设置正确,否则将使用默认的 POSIX。

要将“rené”转换为“rene”,我们可以使用以下代码片段

<?php

setlocale
(LC_CTYPE, 'nl_BE.utf8');

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

echo
$string; // 输出 rene

?>
2
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")); ?>
1
vb (at) bertola.eu
14 年前
在我的系统上,根据测试,以及其他人在其他地方的报道,你只能通过追加来组合 TRANSLIT 和 IGNORE

//IGNORE//TRANSLIT

严格按照这个顺序,但不能通过追加 //TRANSLIT//IGNORE,这会导致 //IGNORE 被忽略 ( :) )。

无论如何,很难理解如何设计一个传递选项的系统,它不允许以简洁的方式将两个选项耦合在一起,而且也很难理解为什么默认行为应该是最没有用且最危险的行为(在第一个意外字符出现时丢弃大部分数据)。软件设计失败 :-/
1
mirek at burkon dot org
16 年前
如果您需要从 UTF-8 中尽可能多地剥离国家字符,并将输入的其余部分保持不变(即,将所有可以转换为 ASCII 的字符转换为 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!
0
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);
?>
0
aissam at yahoo dot com
19 年前
对于那些在浏览器上显示 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);
}
?>
-2
martin at front of mind dot co dot uk
15 年前
对于在 Excel 生成的 CSV 中转换值,以下方法似乎有效

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