2024 年 PHP Conference Japan

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

回傳值

回傳轉換後的字串。

注意事項

注意這個函式是二進位安全的。

參見

新增註解

使用者貢獻的註解 11 則註解

pavel_bashkatov at elkogroup dot com
21 年前
致: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);
}
?>
standov at cgu dot kiev dot ua
19 年前
他是改進的函式,用於解碼 win1251->UTF8
<?php
函式 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 && $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;
}
?>
Vasyl Skotona
17 年前
一個更好的函式,可將 cp1251 字串轉換為 utf8。
適用於俄文和烏克蘭文。

函式 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;
}
zehya [at] yandex dotru
18 年前
cathody at mail dot ru(2005年7月27日 06:41)
你的函式在我的電腦上無法運作..
這個可以運作
函式 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;
}
aeon
20 年前
threed 的函式運作良好,但小寫字母 io (&#1105;) 的替換需要從
(譯)<?php
如果 ($c == 184) { $t .= chr(209) . chr(209); continue; };
?>

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

(譯)所以,最終的結果看起來應該像這樣
(譯)<?php
函式 win3utf($s) {
for($i = 0, $m = strlen($s); $i < $m; $i++) {
$c = ord($s[$i]);
如果 ($c <= 127) { $t .= chr($c); continue; }
// ... (其餘程式碼) ...
?>
(譯) zehyaat] yandex dotru (這部分通常不用翻譯)
18 年前
(譯)抱歉我之前的貼文。不是 array_reverce,array_flip 才是正確的函式。正確的函式:

(譯)函式 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;
}

(譯)抱歉我的英文不好 ;)
(譯) felix[at]tvpro.net.ru (這部分通常不用翻譯)
19 年前
(譯)檢查這段程式碼 -- 完美地將 win-1251 轉換成 UTF-8
(譯)只需一個修正!!!
(譯)如果 ($c == 184) { $t .= chr(209) . chr(145); continue; };

其他不需要了。
感謝 threed [at] koralsoft.com
2003年7月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;
}
?>
strrev("moc.liamg@voglod.yilisav");
15 年前
很遺憾,輸入資料必須是字串。但這或許可以修改! ;)

我使用這個遞迴函式來轉換多維陣列

<?php
函式 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] => Персик
)
)
)*/
?>
chassidus.ru 的 webmaster
19 年前
// 我也用同樣的方式建立了希伯來文到 UTF-8 的轉換

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

// 適用於希伯來文和俄文的簡單 Unicode 編碼器和解碼器

函式 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;

}

函式 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;

}

函式 decode_unicoded_hebrew($str) {
$decode="";

$ar=split("&#",$str); // PHP 7.4 後 split 已棄用,建議使用 explode("&#", $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;
}

函式 decode_unicoded_russian($str) {
$decode="";

$ar=split("&#",$str); // PHP 7.4 後 split 已棄用,建議使用 explode("&#", $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;
}
apoc at ukr dot net
17 年前
:) 那數字怎麼辦!!!???

函式 Utf8Win($str, $type = "w")
{
靜態 $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; }
}
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;
}
?>
To Top