convert_cyr_string

(PHP 4,PHP 5,PHP 7)

convert_cyr_string将一种西里尔字符集转换为另一种

警告

此函数已在 PHP 7.4.0 中弃用,并在 PHP 8.0.0 中移除。强烈建议不要依赖此函数。

描述

convert_cyr_string(string $str, string $from, string $to): string

将一种西里尔字符集转换为另一种。

参数

str

要转换的字符串。

from

源西里尔字符集,以单个字符表示。

to

目标西里尔字符集,以单个字符表示。

支持的字符为

  • k - koi8-r
  • w - windows-1251
  • i - iso8859-5
  • a - x-cp866
  • d - x-cp866
  • m - x-mac-cyrillic

返回值

返回转换后的字符串。

注释

注意: 此函数是二进制安全的。

参见

添加注释

用户贡献的注释 16 个注释

-1
pavel_bashkatov at elkogroup dot com
21 年前
To: mihailsbo at lycos dot ru
转写可以更轻松地完成

<?
function transliterate($cyrstr)
{
$ru = array('A', 'a',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?',
'?', '?');

$en = array('A', 'a',
'B', 'b',
'V', 'v',
'G', 'g',
'D', 'd',
'E', 'e',
'E', 'e',
'Zh', 'zh',
'Z', 'z',
'I', 'i',
'J', 'j',
'K', 'k',
'L', 'l',
'M', 'm',
'N', 'n',
'O', 'o',
'P', 'p',
'R', 'r',
'S', 's',
'T', 't',
'U', 'u',
'F', 'f',
'H', 'h',
'C', 'c',
'Ch', 'ch',
'Sh', 'sh',
'Sch', 'sch',
'\'', '\'',
'Y', 'y',
'\'', '\'',
'E', 'e',
'Ju', 'ju',
'Ja', 'ja');

return str_replace($ru, $en, $cyrstr);
}
?>
-3
standov at cgu dot kiev dot ua
19 年前
他改进了解码 win1251->UTF8 的函数
<?php
function win2utf($s){
$c209 = chr(209); $c208 = chr(208); $c129 = chr(129);
for(
$i=0; $i<strlen($s); $i++) {
$c=ord($s[$i]);
if (
$c>=192 and $c<=239) $t.=$c208.chr($c-48);
elseif (
$c>239) $t.=$c209.chr($c-112);
elseif (
$c==184) $t.=$c209.$c209;
elseif (
$c==168) $t.=$c208.$c129;
else
$t.=$s[$i];
}
return
$t;
}
?>
-3
Vasyl Skotona
16 年前
一个更好的函数来将 cp1251 字符串转换为 utf8。
适用于俄语和乌克兰语文本。

function unicod($str) {
$conv=array();
for($x=128;$x<=143;$x++) $conv[$x+112]=chr(209).chr($x);
for($x=144;$x<=191;$x++) $conv[$x+48]=chr(208).chr($x);
$conv[184]=chr(209).chr(145); #ё
$conv[168]=chr(208).chr(129); #Ё
$conv[179]=chr(209).chr(150); #і
$conv[178]=chr(208).chr(134); #І
$conv[191]=chr(209).chr(151); #ї
$conv[175]=chr(208).chr(135); #ї
$conv[186]=chr(209).chr(148); #є
$conv[170]=chr(208).chr(132); #Є
$conv[180]=chr(210).chr(145); #ґ
$conv[165]=chr(210).chr(144); #Ґ
$conv[184]=chr(209).chr(145); #Ґ
$ar=str_split($str);
foreach($ar as $b) if(isset($conv[ord($b)])) $nstr.=$conv[ord($b)]; else $nstr.=$b;
return $nstr;
}
-3
zehyaat] yandex dotru
18 年前
抱歉,我之前发帖了。不是 array_reverce,array_flip 是实际函数。正确的函数

function Encode($str,$type=u)
{
$conv=array();
for($x=192;$x<=239;$x++)
$conv[u][chr($x)]=chr(208).chr($x-48);
for($x=240;$x<=255;$x++)
$conv[u][chr($x)]=chr(209).chr($x-112);
$conv[u][chr(168)]=chr(208).chr(129);
$conv[u][chr(184)]=chr(209).chr(209);
$conv[w]=array_flip($conv[u]);
if($type=='w' || $type=='u')
return strtr($str,$conv[$type]);
else
return $str;
}

抱歉,我的英语不好 ;)
-3
felix[at]tvpro.net.ru
19 年前
检查这段代码 - 非常适合将 win-1251 转换为 UTF-8
只需一个修正!
if ($c==184) { $t.=chr(209).chr(145); continue; };

其他方面都不需要。
感谢 threed [at] koralsoft.com
2003-07-28 03:37
我尝试了这里的所有函数来将 cp1251 转换为 unicode,但它们不起作用。我认为这个有效

<?php
function win3utf($s) {
for(
$i=0, $m=strlen($s); $i<$m; $i++) {
$c=ord($s[$i]);
if (
$c<=127) {$t.=chr($c); continue; }
if (
$c>=192 && $c<=207) {$t.=chr(208).chr($c-48); continue; }
if (
$c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; }
if (
$c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; }
if (
$c==184) { $t.=chr(209).chr(209); continue; };
if (
$c==168) { $t.=chr(208).chr(129); continue; };
}
return
$t;
}
?>
-5
Sote Korveziroski
18 年前
只有这段代码对我有用,可以将 win-1251 转换为 utf-8,以处理马其顿语字母!

// 由 tapin13 修改
// 由 Timuretis 修正
// 由 Sote 为马其顿语西里尔字母修正
// 将 win-1251 转换为 utf-8

function unicode_mk_cyr($str) {
$encode = "";

for ($ii=0;$ii<strlen($str);$ii++) {
$xchr=substr($str,$ii,1);
echo "<p>".ord($xchr)."</p>\n";
if (ord($xchr)>191) {
$xchr=ord($xchr)+848;
$xchr="&#" . $xchr . ";";
}
if(ord($xchr) == 129) {
$xchr = "&#1027;";
}
if(ord($xchr) == 163) {
$xchr = "&#1032;";
}
if(ord($xchr) == 138) {
$xchr = "&#1033;";
}
if(ord($xchr) == 140) {
$xchr = "&#1034;";
}
if(ord($xchr) == 143) {
$xchr = "&#1039;";
}
if(ord($xchr) == 141) {
$xchr = "&#1036;";
}
if(ord($xchr) == 189) {
$xchr = "&#1029;";
}

if(ord($xchr) == 188) {
$xchr = "&#1112;";
}
if(ord($xchr) == 131) {
$xchr = "&#1107;";
}
if(ord($xchr) == 190) {
$xchr = "&#1109;";
}
if(ord($xchr) == 154) {
$xchr = "&#1113;";
}
if(ord($xchr) == 156) {
$xchr = "&#1114;";
}
if(ord($xchr) == 159) {
$xchr = "&#1119;";
}
if(ord($xchr) == 157) {
$xchr = "&#1116;";
}
$encode=$encode . $xchr;
}
return $encode;
}
-4
aeon
20 年前
threed 的函数运行良好,但小写字母 io (&#1105;) 的替换需要从
<?php
if ($c==184) { $t.=chr(209).chr(209); continue; };
?>

to
<?php
if ($c==184) { $t.=chr(209).chr(145); continue; };
?>

更改为,最终的运行结果应该如下所示
<?php
function win3utf($s) {
for(
$i=0, $m=strlen($s); $i<$m; $i++) {
$c=ord($s[$i]);
if (
$c<=127) {$t.=chr($c); continue; }
if (
$c>=192 && $c<=207) {$t.=chr(208).chr($c-48); continue; }
if (
$c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; }
if (
$c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; }
if (
$c==184) { $t.=chr(209).chr(209); continue; };
if (
$c==168) { $t.=chr(208).chr(129); continue; };
}
return
$t;
}
?>
-4
strrev(&#34;moc dot liamg at voglod dot yilisav&#34;);
15 年前
不幸的是,输入数据必须是字符串。但这可以更改!;)

要转换多维数组,我使用此递归函数

<?php
function convert_cyr_array($array,$from,$to){
foreach(
$array as $key=>$value){
if(
is_array($value)) {
$result[$key] = convert_cyr_array($value,$from,$to);
continue;
}
$result[$key] = convert_cyr_string($value,$from,$to);
}
return
$result;
}
?>

一个示例

<?php
$array
[0] = "сВМПЛП";
$array[1] = "зТХЫБ";
$array[2] = array("пЗХТЕГ","рПНЙДПТ");
$array[3] = array(
array(
"бРЕМШУЙО","нБОДБТЙО"),
array(
"бВТЙЛПУ","рЕТУЙЛ")
);

$result = convert_cyr_array($array,"k","w");
/* 返回:

数组
(
[0] => Яблоко
[1] => Груша
[2] => 数组
(
[0] => Огурец
[1] => Помидор
)
[3] => 数组
(
[0] => 数组
(
[0] => Апельсин
[1] => Мандарин
)
[1] => 数组
(
[0] => Абрикос
[1] => Персик
)
)
)*/
?>
-4
webmaster at chassidus dot ru
18 年前
// 我也为希伯来语转换为 utf 构建了同样的方式

function heb2utf($s) {

for($i=0, $m=strlen($s); $i<$m; $i++) {
$c=ord($s[$i]);
if ($c<=127) {$t.=chr($c); continue; }
if ($c>=224 ) {$t.=chr(215).chr($c-80); continue; }


}
return $t;
}

// 希伯来语和俄语的简单编码器和解码器

function unicode_hebrew($str) {
for ($ii=0;$ii<strlen($str);$ii++) {
$xchr=substr($str,$ii,1);
if (ord($xchr)>223) {
$xchr=ord($xchr)+1264;
$xchr="&#" . $xchr . ";";
}
$encode=$encode . $xchr;

}
return $encode;

}

function unicode_russian($str) {
for ($ii=0;$ii<strlen($str);$ii++) {
$xchr=substr($str,$ii,1);
if (ord($xchr)>191) {
$xchr=ord($xchr)+848;
$xchr="&#" . $xchr . ";";
}
$encode=$encode . $xchr;

}
return $encode;

}

function decode_unicoded_hebrew($str) {
$decode="";

$ar=split("&#",$str);

foreach ($ar as $value ) {

$in1=strpos($value,";"); //代码结束

if ($in1>0) { // Unicode

$code=substr($value,0,$in1);

if ($code>=1456 and $code<=1514) { //希伯来语
$code=$code-1264;
$xchr=chr($code);
} else { //其他Unicode
$xchr="&#" . $code . ";";
}
$xchr=$xchr . substr($value,$in1+1);
} else //非Unicode
$xchr = $value;


$decode=$decode . $xchr;
}
return $decode;
}

function decode_unicoded_russian($str) {
$decode="";

$ar=split("&#",$str);

foreach ($ar as $value ) {

$in1=strpos($value,";"); //代码结束

if ($in1>0) { // Unicode

$code=substr($value,0,$in1);

if ($code>=1040 and $code<=1103) {
$code=$code-848;
$xchr=chr($code);
} else {
$xchr="&#" . $code . ";";
}
$xchr=$xchr . substr($value,$in1+1);
} else
$xchr = $value;


$decode=$decode . $xchr;
}
return $decode;
}
-4
apoc at ukr dot net
16 年前
:) 数字呢?!!!

function Utf8Win($str,$type="w")
{
static $conv='';
if (!is_array($conv))
{
$conv = array();
for($x=128;$x<=143;$x++)
{
$conv['u'][]=chr(209).chr($x);
$conv['w'][]=chr($x+112);
}
for($x=144;$x<=191;$x++)
{
$conv['u'][]=chr(208).chr($x);
$conv['w'][]=chr($x+48);
}
$conv['u'][]=chr(208).chr(129); // Ё
$conv['w'][]=chr(168);
$conv['u'][]=chr(209).chr(145); // ё
$conv['w'][]=chr(184);
$conv['u'][]=chr(208).chr(135); // Ї
$conv['w'][]=chr(175);
$conv['u'][]=chr(209).chr(151); // ї
$conv['w'][]=chr(191);
$conv['u'][]=chr(208).chr(134); // І
$conv['w'][]=chr(178);
$conv['u'][]=chr(209).chr(150); // і
$conv['w'][]=chr(179);
$conv['u'][]=chr(210).chr(144); // Ґ
$conv['w'][]=chr(165);
$conv['u'][]=chr(210).chr(145); // ґ
$conv['w'][]=chr(180);
$conv['u'][]=chr(208).chr(132); // Є
$conv['w'][]=chr(170);
$conv['u'][]=chr(209).chr(148); // є
$conv['w'][]=chr(186);
$conv['u'][]=chr(226).chr(132).chr(150); // №
$conv['w'][]=chr(185);
}
if ($type == 'w') { return str_replace($conv['u'],$conv['w'],$str); }
elseif ($type == 'u') { return str_replace($conv['w'], $conv['u'],$str); }
else { return $str; }
}
-5
zehya [at] yandex dotru
18 年前
cathody at mail dot ru(2005年7月27日 06:41)
你的函数在我的电脑上不起作用..
它工作
function Encode2($str,$type)
{
$conv=array();
for($x=192;$x<=239;$x++)
$conv[u][chr($x)]=chr(208).chr($x-48);
for($x=240;$x<=255;$x++)
$conv[u][chr($x)]=chr(209).chr($x-112);
$conv[u][chr(168)]=chr(208).chr(129);
$conv[u][chr(184)]=chr(209).chr(209);
$conv[w]=array_reverse($conv[u]);
if($type=='w' || $type=='u')
return strtr($str,$conv[$type]);
else
return $str;
}
-6
Sote Korveziroski
18 年前
我犯了个错误,删除了这条测试行
echo "<p>".ord($xchr)."</p>\n";
代码应该是这样的

// 由 tapin13 修改
// 由 Timuretis 修正
// 由 Sote 为马其顿语西里尔字母修正
// 将 win-1251 转换为 utf-8

function unicode_mk_cyr($str) {
$encode = "";

for ($ii=0;$ii<strlen($str);$ii++) {
$xchr=substr($str,$ii,1);
if (ord($xchr)>191) {
$xchr=ord($xchr)+848;
$xchr="&#" . $xchr . ";";
}
if(ord($xchr) == 129) {
$xchr = "&#1027;";
}
if(ord($xchr) == 163) {
$xchr = "&#1032;";
}
if(ord($xchr) == 138) {
$xchr = "&#1033;";
}
if(ord($xchr) == 140) {
$xchr = "&#1034;";
}
if(ord($xchr) == 143) {
$xchr = "&#1039;";
}
if(ord($xchr) == 141) {
$xchr = "&#1036;";
}
if(ord($xchr) == 189) {
$xchr = "&#1029;";
}

if(ord($xchr) == 188) {
$xchr = "&#1112;";
}
if(ord($xchr) == 131) {
$xchr = "&#1107;";
}
if(ord($xchr) == 190) {
$xchr = "&#1109;";
}
if(ord($xchr) == 154) {
$xchr = "&#1113;";
}
if(ord($xchr) == 156) {
$xchr = "&#1114;";
}
if(ord($xchr) == 159) {
$xchr = "&#1119;";
}
if(ord($xchr) == 157) {
$xchr = "&#1116;";
}
$encode=$encode . $xchr;
}
return $encode;
}
-6
cathody at mail dot ru
19 年前
赞赏其他人为编写方便的 UTF8 到 Win-1251 函数所做出的努力,我可以提一下,由于 str_replace 允许数组作为参数,因此该函数可以以稍微高效的方式重写(此外,生成的数组可以存储以提高性能)

<?php

function Encode ( $str, $type )
{
// $type:
// 'w' - 从 UTF 编码到 win
// 'u' - 从 win 编码到 UTF

static $conv='';
if (!
is_array ( $conv ))
{
$conv=array ();
for (
$x=128; $x <=143; $x++ )
{
$conv['utf'][]=chr(209).chr($x);
$conv['win'][]=chr($x+112);
}

for (
$x=144; $x <=191; $x++ )
{
$conv['utf'][]=chr(208).chr($x);
$conv['win'][]=chr($x+48);
}

$conv['utf'][]=chr(208).chr(129);
$conv['win'][]=chr(168);
$conv['utf'][]=chr(209).chr(145);
$conv['win'][]=chr(184);
}
if (
$type=='w' )
return
str_replace ( $conv['utf'], $conv['win'], $str );
elseif (
$type=='u' )
return
str_replace ( $conv['win'], $conv['utf'], $str );
else
return
$str;
}
?>
-5
threed [at] koralsoft.com
21 年前
我尝试了这里的所有函数来将 cp1251 转换为 unicode,但它们不起作用。我认为这个有效

<?php
function win3utf($s) {
for(
$i=0, $m=strlen($s); $i<$m; $i++) {
$c=ord($s[$i]);
if (
$c<=127) {$t.=chr($c); continue; }
if (
$c>=192 && $c<=207) {$t.=chr(208).chr($c-48); continue; }
if (
$c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; }
if (
$c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; }
if (
$c==184) { $t.=chr(209).chr(209); continue; };
if (
$c==168) { $t.=chr(208).chr(129); continue; };
}
return
$t;
}
?>
-8
german at artexpert dot ee
21 年前
之前的代码片段(grmaxim 的 win_to_utf8 函数)对我不起作用,所以我编写了自己的函数来从 win1251 转换为 utf8

<?php
function win2utf($s) {
for(
$i=0,$m=strlen($s);$i<$m;$i++) {
$c=ord($s[$i]);
if (
$c>127) // 只转换特殊字符
if ($c==184) $t.=chr(209).chr(209); // 小写 io
elseif ($c==168) $t.=chr(208).chr(129); // 大写 io
else $t.=($c>239?chr(209):chr(208)).chr($c-48);
else
$t.=$s[$i];
}
return
$t;
}
?>

希望这有帮助
-7
mokvas at freemail dot org dot mk
23年前
该函数不支持所有西里尔字母。来自马其顿语字母的西里尔字母,如 Sh、kj、dz'、nj 不受支持。
To Top