recode_string

(PHP 4、PHP 5、PHP 7 < 7.4.0)

recode_string根据 recode 请求重新编码字符串

说明

recode_string(string $request, string $string): string

根据 recode 请求 request 重新编码字符串 string

参数

request

所需的 recode 请求类型

string

要重新编码的 string

返回值

返回重新编码的 stringfalse,如果无法执行 recode 请求。

范例

范例 #1 基本 recode_string() 范例

<?php
echo recode_string("us..flat", "The following character has a diacritical mark: á");
?>

注释

一个简单的 recode 请求可能是 "lat1..iso646-de"。

参见

  • 有关 recode 请求的详细说明,请参阅安装的 GNU Recode 文档。
  • mb_convert_encoding() - 将字符串从一种字符编码转换为另一种字符编码
  • UConverter::transcode() - 将字符串从一种字符编码转换为另一种字符编码
  • iconv() - 将字符串从一种字符编码转换为另一种字符编码

添加注释

用户贡献注释 4 个注释

4
jazfresh at spam-javelin.hotmail.com
20 年前
我在使用 recode_string 时遇到了一个错误(以及解决方法)。当从 utf-8 转换为 iso-2022-jp 时,它总是返回空字符串(尽管它对从 html 到 utf8 的转换可以正常工作)。在命令行上使用 recode 转换可以正常工作,这很奇怪。我注意到,如果我在命令行上指定 "-v",recode 会说明它正在使用 libiconv 进行转换。

使用 "iconv" 而不是 recode 得到了正确的结果。


有效
$str = recode_string("html..utf-8", "&#26085;&#26412;&#35486;"); // "Japanese" 的 Unicode

无效
$str = recode_string("utf-8..iso-2022-jp", $mystring);

有效
$str = iconv("utf-8", "iso-2022-jp", $mystring);

别问我为什么。希望这能帮某人节省几小时令人沮丧的调试时间。
2
bisqwit at iki dot fi
18 年前
以下是如何使用 PHP 将罗马音转换为片假名/平假名(音译日语文本)。
函数 Romaji2Kana($s) 将返回带有键 'hira' 和 'kata' 的值,分别包含给定字符串的平假名和片假名版本,以 UTF-8 编码。

<?php
// eucjp: 2421; unicode: 3041
define('HIRATABLE', 'a A i I u U e E o O KAGAKIGIKUGUKEGEKOGOSAZASIZISUZUSEZESOZO'.
'TADATIDItuTUDUTEDETODONANINUNENOHABAPAHIBIPIHUBUPUHEBEPEHOBOPO'.
'MAMIMUMEMOyaYAyuYUyoYORARIRUREROwaWAWIWEWOn ');
// eucjp: 2521; unicode: 30A1
define('KATATABLE', 'a A i I u U e E o O KAGAKIGIKUGUKEGEKOGOSAZASIZISUZUSEZESOZO'.
'TADATIDItuTUDUTEDETODONANINUNENOHABAPAHIBIPIHUBUPUHEBEPEHOBOPO'.
'MAMIMUMEMOyaYAyuYUyoYORARIRUREROwaWAWIWEWOn VUkake');

function
HiraTrans($s)
{
#print "trans('$s')\n";
$pos = strpos(HIRATABLE, $s);
if(
$pos===false) return 0xA1BC; // ^
return 0xA4A1 + $pos/2;
}
function
KataTrans($s)
{
$pos = strpos(KATATABLE, $s);
if(
$pos===false) return 0xA1BC; // ^
return 0xA5A1 + $pos/2;
}

function
Romaji2Kana($s)
{
$s = strtoupper(str_replace(
Array(
'shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dz', 'l', '-',
'â', 'î', 'û', 'ê', 'ô', 'ā', 'ī', 'ū', 'ē', 'ō'),
Array(
'si', 'sy', 'hu', 'ti', 'ty', 'tu', 'j', 'r', '^',
'a^', 'i^', 'u^', 'e^', 'o^', 'a^', 'i^', 'u^', 'e^', 'o^'),
$s));
// FO -> FUxo
$s = preg_replace('@F([AIOE])@e', '"HU".strtolower("\1")', $s);
// VO -> VUxo
$s = preg_replace('@V([AIUEO])@e', '"VU".strtolower("\1")', $s);
// KYA -> KYya
$s = preg_replace('@([KSTNHMRGZBPD])Y([AUO])@e', '"\1Iy".strtolower("\2")', $s);
// XTU -> tu (make them actually small)
$s = preg_replace('@X(TU|Y[AUO]|[AIUEO]|KA|KE)@e', 'strtolower("\1")', $s);
// KKO -> tuKO
$s = preg_replace('@([KSTHMRYWGZBPDV]{2,})@e',
'str_pad("",2*strlen("\1")-2,"tu").substr("\1",0,1)', $s);
// N -> n (but not NO -> nO)
// At this point, N' will work correctly
$s = preg_replace('@N(?![AIUEO])@', 'n', $s);
// Unrecognized characters off
$s = eregi_replace('[^^VAIUEOKSTNHMYRWGZBPD]', '', $s);

$pat = '@([AIUEOnaiueo^]|..)@e';
$rec = 'EUCJP..UTF8';

return
Array(
'hira' => recode_string($rec,preg_replace($pat, 'pack("n", HiraTrans("\1"))', $s)),
'kata' => recode_string($rec,preg_replace($pat, 'pack("n", KataTrans("\1"))', $s)));
}

print_r( Romaji2Kana('konnichiha') );
?>

注意:由于手册页面中的技术限制,此代码中存在两个错误
- 第一个 str_replace 中的一些字符在某些 php.net 镜像中可能显示不正确。它应该包含带抑扬音的 aiueo 和带长音符号的 aiueo。
- define 中的字符串应该是常量,而不是追加表达式。(行长限制)

-Joel Yliluoma
-6
msimonc at yahoo dot com
15 年前
似乎需要安装 librecode。
尝试使用 iconv() 代替。
-6
mori at homoeopathy dot co dot jp
10 年前
函数 Romaji2Kana 工作得很好,但有一些例外:"JA" 和 "DZA" 未按日语说话者的预期进行正确转换。以下是针对此行为的修正。

public function convert($s, $mode='hiragana')
{
$s = strtoupper(str_replace(
- Array('shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dz', 'l', '-',
+ Array('shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dzi', 'ji', 'j', 'l', '-',
'â', 'î', 'û', 'ê', 'ô', 'ā', 'ī', 'ū', 'ē', 'ō'),
- Array('si', 'sy', 'hu', 'ti', 'ty', 'tu', 'j', 'r', '^',
+ Array('si', 'sy', 'hu', 'ti', 'ty', 'tu', 'zi', 'zi', 'dz','r', '^',
'a^', 'i^', 'u^', 'e^', 'o^', 'a^', 'i^', 'u^', 'e^', 'o^'),
$s));
+ // DZA -> ZIya
+ $s = preg_replace('/DZ([AUO])/e', '"ZI".strtolower("y\1")', $s);
+ // DZE -> ZIe
+ $s = preg_replace('/DZ([E])/e', '"ZI".strtolower("\1")', $s);
// FO -> FUxo
$s = preg_replace('@F([AIOE])@e', '"HU".strtolower("\1")', $s);
// VO -> VUxo
To Top