保加利亚语-MIK字符集的PHP问题,无法获得一个字母

时间:2019-03-06 12:40:00

标签: php character-encoding

我知道可以使用ord函数转换保加利亚米克字符集并添加64,而保加利亚米克字符从127到191,但是我无法获得字母“а”(ord-127)。我尝试过有很多方法,但是似乎php正在用空白符号处理“а”,而我却无法获得它。

 define("PHP_NL", "<br>"); 
$string  = '--------------  1 --------------'.PHP_NL;
$string .= '413 …±Ї°Ґ±® €¶®        X1.000'.PHP_NL;
$string .= '358 ЊЁ­ ‚®¤  0.5       X1.000'.PHP_NL;
$string .= '--------------------------------'.PHP_NL;
$string .= '1 -Ђ¤°Ё ­  - ЊЂ‘Ђ: 1 - 6'.PHP_NL;
$string .= '17-08-2018       09:05:32'.PHP_NL;
$string .= '--------------------------------';

这是我使用保加利亚-MIK编码的字符串。我尝试将其转换,但我每个字母都转换得很好,但只有“а”我无法获得。 我的功能

function ConvertDosToWin($string) {

    $chr = null;

    for ($i = 1;$i<strlen($string);$i++) {

        $chr = mb_convert_encoding($string[$i],'utf-8','windows-1251');
        if((ord($chr) >= 127) && (ord($chr)<=(127+64)) ) {
            echo 'inside if';
            $string[$i] = chr(ord($chr)+64);
        }

    }
    return $string;
  }

2 个答案:

答案 0 :(得分:0)

我认为这种方法可能会有所帮助。我在一个旧项目中使用了它,接下来是工作示例。 PHP文件是Windows-1251编码的。如果您的文本使用不同的编码,则需要使用mb_convert_encoding()iconv()转换文本,因为ord()返回的文本的第一个字节的二进制值是0到255之间的无符号整数

Test.php:

<?php
// Functions
function ConvertDosToWin($string) {
    $chr = null;
    for ($i = 0; $i<strlen($string); $i++) {
        if ((ord($chr) >= 128) && (ord($chr) <= 191)) {
            $string[$i] = chr(ord($chr) + 64);
        }
    }
    return $string;
}
function ConvertWinToDos($string) {
    $chr = null;
    for ($i = 0; $i<strlen($string); $i++) {
        $chr = $string[$i];
        if ((ord($chr) >= 192) && (ord($chr) <= 255)) {
            $string[$i] = chr(ord($chr) - 64);
        }
    }
    return $string;
}

// Output    
$text = 'АБВГДЕЖЗИЙ';
$text = ConvertWinToDos($text);
file_put_contents('dos.txt', $text);
?>

答案 1 :(得分:0)

我使用iconv解决了该问题。

   function ConvertWinToDos($string) {
    $chr = null;
    for ($i = 1;$i<strlen($string);$i++) {
        $string = iconv(mb_detect_encoding($string,mb_detect_order(),true),'windows-1251',$string);
        $chr = $string[$i];
        if ((ord($chr) >= 192) && (ord($chr) <= 255)) {
            $string[$i] = chr(ord($chr) - 64);
        }
    }

    return $string;
}