mb_convert_encoding

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

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

说明

mb_convert_encoding(数组|字符串 $string, 字符串 $to_encoding, 数组|字符串| $from_encoding = ): 数组|字符串|false

$string$from_encoding(或当前内部编码)转换为 $to_encoding。如果 $string 是一个 数组,则其所有 字符串 值将被递归地转换。

参数

string

要转换的 字符串数组

to_encoding

结果所需的编码。

from_encoding

用于解释 $string 的当前编码。可以将多个编码指定为一个 数组 或逗号分隔列表,在这种情况下,将使用与 mb_detect_encoding() 相同的算法来猜测正确的编码。

如果省略 $from_encoding 或为 ,则将使用 mbstring.internal_encoding 设置(如果已设置),否则将使用 default_charset 设置

有关 $to_encoding$from_encoding 的有效值,请参阅 支持的编码

返回值

如果成功,则返回编码后的 字符串数组,如果失败,则返回 false

错误/异常

从 PHP 8.0.0 开始,如果 $to_encoding$from_encoding 的值为无效编码,则会抛出 ValueError。在 PHP 8.0.0 之前,会发出 E_WARNING

变更日志

版本 说明
8.2.0 mb_convert_encoding() 将不再返回以下非文本编码:"Base64""QPrint""UUencode""HTML 实体""7 位""8 位"
8.0.0 $to_encoding 传递了无效编码时,mb_convert_encoding() 现在将抛出 ValueError
8.0.0 $from_encoding 传递了无效编码时,mb_convert_encoding() 现在将抛出 ValueError
8.0.0 $from_encoding 现在可以为空。
7.2.0 此函数现在还接受 数组 作为 $string。以前,只支持 字符串

范例

范例 #1 mb_convert_encoding() 示例

<?php
/* 将内部字符编码转换为 SJIS */
$str = mb_convert_encoding($str, "SJIS");

/* 将 EUC-JP 转换为 UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");

/* 从 JIS、eucjp-win、sjis-win 自动检测编码,然后将 str 转换为 UCS-2LE */
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");

/* 如果 mbstring.language 为 "Japanese","auto" 将扩展为 "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
$str = mb_convert_encoding($str, "EUC-JP", "auto");
?>

参见

添加注释

用户贡献的注释 35 个注释

josip at cubrad dot com
11 年前
在我的上一个项目中,我需要将几个 CSV 文件从 Windows-1250 转换为 UTF-8,在搜索了几天后,我找到一个函数,它部分解决了我的问题,但它仍然没有转换所有字符。所以我做了这个

function w1250_to_utf8($text) {
// 基于
// http://konfiguracja.c0.pl/iso02vscp1250en.html
// http://konfiguracja.c0.pl/webpl/index_en.html#examp
// http://www.htmlentities.com/html/entities/
$map = array(
chr(0x8A) => chr(0xA9),
chr(0x8C) => chr(0xA6),
chr(0x8D) => chr(0xAB),
chr(0x8E) => chr(0xAE),
chr(0x8F) => chr(0xAC),
chr(0x9C) => chr(0xB6),
chr(0x9D) => chr(0xBB),
chr(0xA1) => chr(0xB7),
chr(0xA5) => chr(0xA1),
chr(0xBC) => chr(0xA5),
chr(0x9F) => chr(0xBC),
chr(0xB9) => chr(0xB1),
chr(0x9A) => chr(0xB9),
chr(0xBE) => chr(0xB5),
chr(0x9E) => chr(0xBE),
chr(0x80) => '&euro;',
chr(0x82) => '&sbquo;',
chr(0x84) => '&bdquo;',
chr(0x85) => '&hellip;',
chr(0x86) => '&dagger;',
chr(0x87) => '&Dagger;',
chr(0x89) => '&permil;',
chr(0x8B) => '&lsaquo;',
chr(0x91) => '&lsquo;',
chr(0x92) => '&rsquo;',
chr(0x93) => '&ldquo;',
chr(0x94) => '&rdquo;',
chr(0x95) => '&bull;',
chr(0x96) => '&ndash;',
chr(0x97) => '&mdash;',
chr(0x99) => '&trade;',
chr(0x9B) => '&rsquo;',
chr(0xA6) => '&brvbar;',
chr(0xA9) => '&copy;',
chr(0xAB) => '&laquo;',
chr(0xAE) => '&reg;',
chr(0xB1) => '&plusmn;',
chr(0xB5) => '&micro;',
chr(0xB6) => '&para;',
chr(0xB7) => '&middot;',
chr(0xBB) => '&raquo;',
);
return html_entity_decode(mb_convert_encoding(strtr($text, $map), 'UTF-8', 'ISO-8859-2'), ENT_QUOTES, 'UTF-8');
}
Julian Egelstaff
1 年前
如果您有看起来像 ISO-8859-1 的内容,但它包含来自 Microsoft 软件的“智能引号”,或者用户从 Microsoft 软件中剪切和粘贴内容,那么您实际处理的内容可能是 Windows-1252。试试这个

<?php
$cleanText
= mb_convert_encoding($text, 'UTF-8', 'Windows-1252');
?>

令人讨厌的是,自动检测(即:mb_detect_encoding 函数)通常会将 Windows-1252 视为 ISO-8859-1。很接近,但不是完全一样。如果您随后要对结果文本进行 unserialize,这一点至关重要,因为字符串的字节计数需要完美无缺。
regrunge at hotmail dot it
14 年前
我一直在尝试找到一个在 Mac 上编写的挪威语(包含大量 ø、æ、å)txt 文件的字符集,我用以下方法找到了它

<?php
$text
= "一个奇怪的字符串要传递,也许包含一些 ø、æ、å 字符。" ;

foreach(
mb_list_encodings() as $chr){
echo
mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>";
}
?>

看起来不错的行会告诉你它的编码方式。

希望可以帮到其他人
volker at machon dot biz
16 年前
嘿,伙计们。对于所有寻找将 iso 字符串转换为 utf8 或将 utf8 字符串转换为 iso 的函数的人,这里有解决方案

public function encodeToUtf8($string) {
return mb_convert_encoding($string, "UTF-8", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}

public function encodeToIso($string) {
return mb_convert_encoding($string, "ISO-8859-1", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}

对我来说这些函数运行良好。试试看
Rainer Perske
1 年前
从 PHP 8.2 开始,文本编码 HTML-ENTITIES 将被弃用。

为了将所有非 ASCII 字符转换为实体(以生成纯 7 位 HTML 输出),我一直在使用

<?php
echo mb_convert_encoding( htmlspecialchars( $text, ENT_QUOTES, 'UTF-8' ), 'HTML-ENTITIES', 'UTF-8' );
?>

我可以使用以下方法获得相同的结果

<?php
echo mb_encode_numericentity( htmlentities( $text, ENT_QUOTES, 'UTF-8' ), [0x80, 0x10FFFF, 0, ~0], 'UTF-8' );
?>

输出包含一些常用字符的众所周知的命名实体和其余字符的数字实体。
francois at bonzon point com
15 年前
aaron,要丢弃不支持的字符而不是打印“?”,你也可以简单地设置配置指令

mbstring.substitute_character = "none"

在你的 php.ini 中。确保在 "none" 周围包含引号。或者在运行时使用

<?php
ini_set
('mbstring.substitute_character', "none");
?>
aaron at aarongough dot com
15 年前
我下面的解决方案略有不正确,所以这里是正确的版本(我在一天结束的时候发布的,从来都不是个好主意!)

再说一次,这是一个快速而肮脏的解决方案,可以阻止 mb_convert_encoding 在遇到目标编码中不合法字符时用问号填充你的字符串。

<?php
function convert_to ( $source, $target_encoding )
{
// 检测传入文件的字符编码
$encoding = mb_detect_encoding( $source, "auto" );

// 转义所有问号,以便我们可以删除 unicode 转换过程中的伪影
$target = str_replace( "?", "[question_mark]", $source );

// 将字符串转换为目标编码
$target = mb_convert_encoding( $target, $target_encoding, $encoding);

// 删除由于不合法字符而引入的任何问号
$target = str_replace( "?", "", $target );

// 将标记字符串 "[question_mark]" 替换为符号 "?"
$target = str_replace( "[question_mark]", "?", $target );

return
$target;
}
?>

希望这对某人有帮助!(管理员可以随意删除我之前不正确的帖子,以确保清晰度)
-A
eion at bigfoot dot com
18 年前
下面很多人都在谈论使用
<?php
mb_convert_encode
($s,'HTML-ENTITIES','UTF-8');
?>
将非 ASCII 代码转换为 html 可读的东西。由于我的网络服务器不受我的控制,我无法设置数据库字符集,每当 PHP 从数据库中提取我的 $s 变量并创建它的副本时,它会自动将其转换为讨厌的 latin1 而不将其保留在漂亮的 UTF-8 中。

所以 [此处插入韩文字符] 变成了 ?????。

我发现自己需要通过引用传递(当然,这在最近版本的 PHP 中被弃用/不存在)
所以不是
<?php
mb_convert_encode
(&$s,'HTML-ENTITIES','UTF-8');
?>
它工作得很好,直到我升级,所以我不得不使用
<?php
call_user_func_array
('mb_convert_encoding', array(&$s,'HTML-ENTITIES','UTF-8'));
?>

希望它能帮助其他人
Stephan van der Feest
18 年前
为了补充下面的 Flash 转换评论,以下是我如何在从 Flash HTML 文本字段输出转换后从数据库中存储的内容转换回来,以便将其重新加载到 Flash HTML 文本字段中

function htmltoflash($htmlstr)
{
return str_replace("&lt;br /&gt;","\n",
str_replace("<","&lt;",
str_replace(">","&gt;",
mb_convert_encoding(html_entity_decode($htmlstr),
"UTF-8","ISO-8859-1"))));
}
urko at wegetit dot eu
11 年前
如果您尝试生成一个(包含扩展字符)CSV 文件,以便在 Mac 版 Exel 中打开,对我来说唯一有效的代码是
<?php mb_convert_encoding( $CSV, 'Windows-1252', 'UTF-8'); ?>

我还尝试过这个

<?php
// 分隔符 OK,字符错误
iconv('MACINTOSH', 'UTF8', $CSV);
// 分隔符错误,字符 OK
chr(255).chr(254).mb_convert_encoding( $CSV, 'UCS-2LE', 'UTF-8');
?>

但是第一个没有正确显示扩展字符,而第二个没有正确分隔字段
vasiliauskas dot agnius at gmail dot com
6 年前
当您需要从 HTML-ENTITIES 转换,但您的 UTF-8 字符串部分损坏(并非所有字符都为 UTF-8)时 - 在这种情况下,将字符串传递给 mb_convert_encoding($string, 'UTF-8', 'HTML-ENTITIES'); - 会使字符串中的字符变得更加损坏。在这种情况下,您需要逐步替换 html 实体以保留字符的良好编码。我为此编写了这样一个闭包
<?php
$decode_entities
= function($string) {
preg_match_all("/&#?\w+;/", $string, $entities, PREG_SET_ORDER);
$entities = array_unique(array_column($entities, 0));
foreach (
$entities as $entity) {
$decoded = mb_convert_encoding($entity, 'UTF-8', 'HTML-ENTITIES');
$string = str_replace($entity, $decoded, $string);
}
return
$string;
};
?>
Daniel Trebbien
15 年前
请注意,`mb_convert_encoding($val, 'HTML-ENTITIES')` 不会转义 `'`, `"`, `<`, `>` 或 `&`。
katzlbtjunk at hotmail dot com
16 年前
通过简单地将所有不需要的字符替换为下划线(ASCII 转换为 7 位),清理用于文件名使用的字符串。它删除的字符略多于必要。希望它有用。

$fileName = 'Test:!"$%&/()=ÖÄÜöäü<<';
echo strtr(mb_convert_encoding($fileName,'ASCII'),
' ,;:?*#!§$%&/(){}<>=`´|\\\'"',
'____________________________');
bmxmale at qwerty dot re
2 年前
/**
* 将 Windows-1250 转换为 UTF-8
* 基于 https://php.net/manual/en/function.mb-convert-encoding.php#112547
*/
class TextConverter
{
private const ENCODING_TO = 'UTF-8';
private const ENCODING_FROM = 'ISO-8859-2';

private array $mapChrChr = [
0x8A => 0xA9,
0x8C => 0xA6,
0x8D => 0xAB,
0x8E => 0xAE,
0x8F => 0xAC,
0x9C => 0xB6,
0x9D => 0xBB,
0xA1 => 0xB7,
0xA5 => 0xA1,
0xBC => 0xA5,
0x9F => 0xBC,
0xB9 => 0xB1,
0x9A => 0xB9,
0xBE => 0xB5,
0x9E => 0xBE
];

私有数组 $mapChrString = [
0x80 => '&euro;',
0x82 => '&sbquo;',
0x84 => '&bdquo;',
0x85 => '&hellip;',
0x86 => '&dagger;',
0x87 => '&Dagger;',
0x89 => '&permil;',
0x8B => '&lsaquo;',
0x91 => '&lsquo;',
0x92 => '&rsquo;',
0x93 => '&ldquo;',
0x94 => '&rdquo;',
0x95 => '&bull;',
0x96 => '&ndash;',
0x97 => '&mdash;',
0x99 => '&trade;',
0x9B => '&rsquo;',
0xA6 => '&brvbar;',
0xA9 => '&copy;',
0xAB => '&laquo;',
0xAE => '&reg;',
0xB1 => '&plusmn;',
0xB5 => '&micro;',
0xB6 => '&para;',
0xB7 => '&middot;',
0xBB => '&raquo;'
];

/**
* @param $text
* @return string
*/
public function execute($text): string
{
$map = $this->prepareMap();

return html_entity_decode(
mb_convert_encoding(strtr($text, $map), self::ENCODING_TO, self::ENCODING_FROM),
ENT_QUOTES,
self::ENCODING_TO
);
}

/**
* @return array
*/
private function prepareMap(): array
{
$maps[] = $this->arrayMapAssoc(function ($k, $v) {
return [chr($k), chr($v)];
}, $this->mapChrChr);

$maps[] = $this->arrayMapAssoc(function ($k, $v) {
return [chr($k), $v];
}, $this->mapChrString);

return array_merge([], ...$maps);
}

/**
* @param callable $function
* @param array $array
* @return array
*/
private function arrayMapAssoc(callable $function, array $array): array
{
return array_column(
array_map(
$function,
array_keys($array),
$array
),
1,
0
);
}
}
Daniel
8 年前
如果您尝试将“UTF-8”文本转换为“ISO-8859-1”,并且结果始终以“ASCII”返回,请在 mb_convert_encoding 之前放置以下代码行

mb_detect_order(array('UTF-8', 'ISO-8859-1'));

必须强制特定的搜索顺序才能使转换起作用
me at gsnedders dot com
15 年前
看起来在处理未知的“from encoding”时,该函数将同时抛出 E_WARNING 并继续将字符串从 ISO-8859-1 转换为“to encoding”。
chzhang at gmail dot com
15 年前
代替 ini_set(),您可以尝试这个

mb_substitute_character("none");
lanka at eurocom dot od dot ua
21 年前
另一个在没有启用 MultiByte 的情况下重新编码的示例。
(俄罗斯 koi->win,如果输入已经是 win 编码,则函数 recode() 返回不变的字符串)

<?php
// 0 - win
// 1 - koi
function detect_encoding($str) {
$win = 0;
$koi = 0;

for(
$i=0; $i<strlen($str); $i++) {
if(
ord($str[$i]) >224 && ord($str[$i]) < 255) $win++;
if(
ord($str[$i]) >192 && ord($str[$i]) < 223) $koi++;
}

if(
$win < $koi ) {
return
1;
} else return
0;

}

// recodes koi to win
function koi_to_win($string) {

$kw = array(128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 254, 224, 225, 246, 228, 229, 244, 227, 245, 232, 233, 234, 235, 236, 237, 238, 239, 255, 240, 241, 242, 243, 230, 226, 252, 251, 231, 248, 253, 249, 247, 250, 222, 192, 193, 214, 196, 197, 212, 195, 213, 200, 201, 202, 203, 204, 205, 206, 207, 223, 208, 209, 210, 211, 198, 194, 220, 219, 199, 216, 221, 217, 215, 218);
$wk = array(128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209);

$end = strlen($string);
$pos = 0;
do {
$c = ord($string[$pos]);
if (
$c>128) {
$string[$pos] = chr($kw[$c-128]);
}

} while (++
$pos < $end);

return
$string;
}

function
recode($str) {

$enc = detect_encoding($str);
if (
$enc==1) {
$str = koi_to_win($str);
}

return
$str;
}
?>
nicole
8 年前
// 将 UTF8 转换为 DOS = CP850
//
// $utf8_text=UTF8 格式的文本;
// $dos=CP850 格式的文本;

// 玩得开心

$dos = mb_convert_encoding($utf8_text, "CP850", mb_detect_encoding($utf8_text, "UTF-8, CP850, ISO-8859-15", true));
Tom Class
18 年前
为什么要使用 php html 编码函数?mbstring 有自己的编码,它(据我测试)更有用

HTML-ENTITIES

示例

$text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8");
mac.com@nemo
18 年前
对于那些想要从 $set 转换为 MacRoman 的人,请使用 iconv()

<?php

$string
= iconv('UTF-8', 'macintosh', $string);

?>

('macintosh' 是 MacRoman 字符集的 IANA 名称。)
David Hull
17 年前
作为 Johannes 建议将字符串从其他字符集转换为 7 位表示的替代方法,而不是仅删除拉丁语重音符号,您可以尝试以下操作

<?php
$text
= iconv($from_enc, 'US-ASCII//TRANSLIT', $text);
?>

唯一的缺点是它不会将“ä”转换为“ae”,但它可以更好地处理标点符号和其他特殊字符。
--
大卫
aofg
16 年前
将日语字符串转换为 ISO-2022-JP 或 JIS 时,在 PHP >= 5.2.1 上,您可以使用“ISO-2022-JP-MS”代替它们。
Kishu-Izon(平台依赖)字符将使用编码正确转换,与 eucJP-win 或 SJIS-win 相同。
jamespilcher1 - hotmail
20 年前
从 iso-8859-1 转换为 utf-8 时要小心。

即使您通过标题和严格的 xml 定义明确指定页面的字符编码为 iso-8859-1,Windows 2000 也会忽略它,并将其解释为其本地安装的任何字符集。

例如,我在一个页面中写入了字符 #128,字符编码为 iso-8859-1,它在 Internet Explorer(和 Mozilla)中显示为欧元符号。

它应该显示一个框,表示字符 #128 在 iso-8859-1 中未定义。问题是它在我的本地字符集“Windows:西欧”中显示。

这导致我在尝试通过 mb_convert_encoding() 将欧元转换为 UTF-8 时感到困惑

IE 正确显示 UTF-8 - 并且由于 PHP 正确地将 #128 转换为 UTF-8 中的框,IE 会显示一个框。

所以我只看到 mb_convert_encoding() 将欧元符号转换为一个框。我花了很长时间才弄清楚发生了什么。
StigC
16 年前
对于 php 新手(像我一样) - 使用 flash 和 php。

这是一个简单的代码片段,对我来说非常有效,让 php 从 Flash 电子邮件表单中显示特殊的丹麦字符

<?php
// 姓名转义
$escName = mb_convert_encoding($_POST["Name"], "ISO-8859-1", "UTF-8");

// 消息转义
$escMessage = mb_convert_encoding($_POST["Message"], "ISO-8859-1", "UTF-8");

// 标头.. 等等...
?>
nospam at nihonbunka dot com
16 年前
rodrigo at bb2 dot co dot jp 写道,inconv 比 mb_convert_encoding 更好用,我发现从 uft8 转换为 shift_jis 时
$conv_str = mb_convert_encoding($str,$toCS,$fromCS);
有效,而
$conv_str = iconv($fromCS,$toCS.'//IGNORE',$str);
从 $str 中删除了波浪号。
gullevek at gullevek dot org
13 年前
如果您想将日语转换为 ISO-2022-JP,强烈建议使用 ISO-2022-JP-MS 作为目标编码。这包括扩展字符集,并避免文本中的“?”。例如,常用的“圆圈中的 1”① 将被正确转换。
rodrigo at bb2 dot co dot jp
16 年前
对于那些不能使用 mb_convert_encoding() 将一个字符集转换为另一个字符集的人,因为 php 版本较低,请尝试使用 iconv()。

我遇到过将日语字符集转换为日语字符集的问题

$txt=mb_convert_encoding($txt,'SJIS',$this->encode);

我可以通过使用以下方法解决它

$txt = iconv('UTF-8', 'SJIS', $txt);

也许这对其他人也有帮助!;)
phpdoc at jeudi dot de
17 年前
我想要分享一些代码来将拉丁语重音符号转换为它们的
传统的 7 位表示,例如,

- &agrave;,&ccedil;,&eacute;,&icirc;,... 到 a,c,e,i,...
- &szlig; 到 ss
- &auml;,&Auml;,... 到 ae,Ae,...
- &euml;,... 到 e,...

(mb_convert “7bit” 将简单地删除任何有问题的字符)。

我可能错过了您国家/地区的印刷
约定 - 纠正我。
&lt;?php
/**
* @args string $text 编码文本行
* string $from_enc($text 的编码类型,例如 UTF-8、ISO-8859-1)
*
* @returns 7 位表示
*/
function to7bit($text,$from_enc) {
$text = mb_convert_encoding($text,\&#039;HTML-ENTITIES\&#039;,$from_enc);
$text = preg_replace(
array(\&#039;/&szlig;/\&#039;,\&#039;/&amp;(..)lig;/\&#039;,
\&#039;/&amp;([aouAOU])uml;/\&#039;,\&#039;/&amp;(.)[^;]*;/\&#039;),
array(\&#039;ss\&#039;,\&quot;$1\&quot;,\&quot;$1\&quot;.\&#039;e\&#039;,\&quot;$1\&quot;),
$text);
return $text;
}
?&gt;

享受 :-)
约翰内斯

==
[由 danbrown AT php DOT net 编辑:作者于 2012 年 2 月 27 日提供了以下更新。]
==

对我在下面的笔记中提到的“to7bit”函数的补充。
该函数旨在解决某些语言需要特殊(带元音符号)字符的不同 7 位渲染以进行排序或其他应用的问题。例如,德语 &szlig; 连字通常在 7 位上下文中写为“ss”。荷兰 &yuml; 通常渲染为“ij”(而不是“y”。)

原始函数对单词(字母)字符实体效果很好,我见过它在很多地方使用。但是非单词实体会导致奇怪的结果
例如,“&copy;”渲染为“c”,“&shy;”渲染为“s”,而“&amp;rquo;”渲染为“r”。
以下版本通过将非字母数字字符(以及它们的链条)转换为“_”来修复此问题。

&lt;?php
/**
* @args string $text 编码文本行
* string $from_enc($text 的编码类型,例如 UTF-8、ISO-8859-1)
*
* @returns 7 位表示
*/
function to7bit($text,$from_enc) {
$text = preg_replace(/W+/,&#039;_&#039;,$text);
$text = mb_convert_encoding($text,&#039;HTML-ENTITIES&#039;,$from_enc);
$text = preg_replace(
array(&#039;/&szlig;/&#039;,&#039;/&amp;(..)lig;/&#039;,
&#039;/&amp;([aouAOU])uml;/&#039;,&#039;/&yuml;/&#039;,&#039;/&amp;(.)[^;]*;/&#039;),
array(&#039;ss&#039;,&quot;$1&quot;,&quot;$1&quot;.&#039;e&#039;,&#039;ij&#039;,&quot;$1&quot;),
$text);
return $text;
}
?&gt;

再次享受,
约翰内斯
qdb at kukmara dot ru
12 年前
mb_substr 以及可能的其他几个函数在 ucs-2 中比在 utf-8 中运行得更快。而 utf-16 的运行速度比 utf-8 慢。以下是一个测试,ucs-2 的速度几乎是 utf-8 的 50 倍,而 utf-16 的速度几乎是 utf-8 的 6 倍
<?php
header
('Content-Type: text/html; charset=utf-8');
mb_internal_encoding('utf-8');

$s='укгезәөшөхзәхөшк2049һһлдябчсячмииюсит.июбҗрарэ'
.'лдэфвәәуүйәуйүәу034928348539857әшаыдларорашһһрлоавы';
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;

$t1=microtime(true);
$i=0;
while(
$i<mb_strlen($s)){
$a=mb_substr($s,$i,2);
$i+=2;
if(
$i==10)echo$a.'. ';
//echo$a.'. ';
}
echo
$i.'. ';
echo(
microtime(true)-$t1);

echo
'<br>';
$s=mb_convert_encoding($s,'UCS-2','utf8');
mb_internal_encoding('UCS-2');
$t1=microtime(true);
$i=0;
while(
$i<mb_strlen($s)){
$a=mb_substr($s,$i,2);
$i+=2;
if(
$i==10)echo mb_convert_encoding($a,'utf8','ucs2').'. ';
//echo$a.'. ';
}
echo
$i.'. ';
echo(
microtime(true)-$t1);

echo
'<br>';
$s=mb_convert_encoding($s,'utf-16','ucs-2');
mb_internal_encoding('utf-16');
$t1=microtime(true);
$i=0;
while(
$i<mb_strlen($s)){
$a=mb_substr($s,$i,2);
$i+=2;
if(
$i==10)echo mb_convert_encoding($a,'utf8','utf-16').'. ';
//echo$a.'. ';
}
echo
$i.'. ';
echo(
microtime(true)-$t1);

?>
output
өх. 12416. 1.71738100052
өх. 12416. 0.0211279392242
өх. 12416. 11.2330229282
Stephan van der Feest
18 年前
对于任何使用 Flash 和 PHP 将从 Flash 文本字段提交的 HTML 输出存储在数据库或其他地方的人来说,这里有一个提示。

Flash 以 UTF-8 格式提交其 HTML 特殊字符,因此您可以使用以下函数将它们转换为 HTML 实体字符

function utf8html($utf8str)
{
return htmlentities(mb_convert_encoding($utf8str,"ISO-8859-1","UTF-8"));
}
DanielAbbey at Hotmail dot co dot uk
10年前
使用 Windows Notepad 文本编辑器时,请务必注意,当您选择“另存为”时,会有一个编码选择下拉菜单。默认编码设置为 ANSI,另外两个选项是 Unicode 和 UTF-8。由于 Web 上的大多数文本都采用 UTF-8 格式,因此以这种编码保存 .txt 文件可能至关重要,因为此函数不适用于 ANSI 编码的文本。
Edward
15 年前
如果 mb_convert_encoding 对您不起作用,并且 iconv 让你头疼,你可能对这个免费类感兴趣。它可以将几乎任何字符集转换为几乎任何其他字符集。我认为它很棒,我真希望我早点发现它。它会帮我省掉很多麻烦。

我将其用作安全保障,以防未安装 mb_convert_encoding。从 http://mikolajj.republika.pl/ 下载它

这不是我自己的库,所以从技术上讲,这不算垃圾邮件,对吧?;)

希望这能有所帮助。
jackycms at outlook dot com
10年前
// mb_convert_encoding($input,'UTF-8','windows-874'); 错误:指定了非法字符编码
// 因此,将泰语转换为 UTF-8 更好地使用 iconv

<?php

iconv
("windows-874","UTF-8",$input);

?>
mightye at gmail dot com
16 年前
致 petruzanauticoyahoo?com!ar

如果您未指定源编码,则它将假定内部(默认)编码。 ñ 是一个多字节字符,其字节在您的配置默认值(通常为 iso-8859-1)中实际上意味着 ñ。mb_convert_encoding() 将这些字符升级到 UTF-8 中的多字节等效项。

尝试改为
<?php
print mb_convert_encoding( "ñ", "UTF-8", "UTF-8" );
?>
当然,此函数不起作用(在大多数情况下 - 它实际上可以用来删除对 UTF-8 无效的字符)。
To Top