2

UTF-8 string があるとしましょう0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯。提供された文字列が012345678901234567890123456789.

どうすればこれを行うことができますか?

4

3 に答える 3

3

PHP に php_intl 拡張子がある場合は、Transliterate クラスを使用できます。

if (version_compare(PHP_VERSION, '5.4.0', '<')) {
    exit ('Transliterator is available on PHP 5.4.0 or later.');
}    
if (!class_exists('Transliterator')) {
    exit ('You need to install php_intl extension.');
}
$any2latin = Transliterator::create("Any-Latin");

$original = "0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯";
echo $any2latin->transliterate($original), "\n";

私はこれを得た、

012345678901234567890123456789

特定の言語を正規化する必要がある場合のために、最初のコードを以下に残しました。

$devanagari2latin = Transliterator::create("Devanagari-Latin");
$bengali2latin = Transliterator::create("Bengali-Latin");

$original = "0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯";
echo $bengali2latin->transliterate($devanagari2latin->transliterate($original)), "\n";
于 2013-07-22T23:54:55.627 に答える
1

異なる言語の数値を標準のアラビア語表現に変換したいですか? そのような関数が標準の PHP に存在するとは思いません。ですから、自分で書く必要があります。幸いなことに、それは難しくありません。非標準の数字のハッシュを作成し、それらをすべて標準に変換するだけです。たとえば、次のスクリプトは中国語の数字をアラビア語に置き換えます。

<?php
$array1 = array(
    '零' => 0,
    '壹' => 1,
    '貳' => 2,
    '參' => 3,
    '肆' => 4,
    '伍' => 5,
    '陸' => 6,
    '柒' => 7,
    '捌' => 8,
    '玖' => 9,
    );

$str = '零壹貳參肆伍陸柒捌玖';
foreach($array1 as $key => $value)
{
    $str = str_replace($key, $value, $str);
}

print $str;

版画:

0123456789
于 2013-07-22T20:32:38.643 に答える
0

私は元のアプローチを修正することができました。これは、膨大な数の変換を維持するよりも優れていると思います。

function NormalizeDigit($val) {
    $zeros = array (
        0x0660,    // Arabic-Indic
        0x06F0,    // Extended Arabic-Indic
        0x07C0,    // NKO
        0x0966,    // Devanagari
        0x09E6,    // Bengali
        0x0A66,    // Gurmukhi
        0x0AE6,    // Gujarati
        0x0B66,    // Oriya
        0x0BE6,    // Tamil
        0x0C66,    // Telugu
        0x0CE6,    // Kannada
        0x0D66,    // Malayalam
        0x0E50,    // Thai
        0x0ED0,    // Lao
        0x0F20,    // Tibetan
        0x1040,    // Myanmar
        0x1090,    // Myanmar Shan
        0x17E0,    // Khmer
        0x1810,    // Mongolian
        0x1946,    // limbu
        0x19D0,    // NEW TAI LUE
        0x1B50,    // BALINESE
        0x1BB0,    // SUNDANESE
        0x1C40,    // LEPCHA
        0x1C50,    // OL CHIKI
        0xA620,    // VAI
        0xA8D0,    // SAURASHTRA
        0xA900,    // KAYAH LI
        0xAA50,    // CHAM
        0xFF10);   // Full Width Japanese

    foreach ($zeros as $zero) {
        if (($val >= $zero) && ($val <= $zero + 9)) {
            return 0x30 + ($val - $zero);
        }
    }
    return $val;
}

function NormalizeDigits($str) {
    $wide = iconv('UTF-8', 'UTF-16', $str);
    for($i = 2; $i < strlen($wide); $i += 2) {
        $wc = (ord($wide[$i]) << 8) | ord($wide[$i + 1]);
        $wc = NormalizeDigit($wc);
        $wide[$i] = chr($wc >> 8);
        $wide[$i + 1] = chr($wc);
    }
    return iconv('UTF-16', 'UTF-8', $wide);
}
于 2013-07-22T21:17:40.193 に答える