规范化多字节php字符串中的整数值
假设我有UTF-8字符串0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯. 我想用ASCII等效值替换所有非ASCII整数值,这样提供的字符串将变成0123456789012345678901234567890123456789规范化多字节php字符串中的整数值,php,unicode,utf-8,internationalization,multibyte,Php,Unicode,Utf 8,Internationalization,Multibyte,假设我有UTF-8字符串0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯. 我想用ASCII等效值替换所有非ASCII整数值,这样提供的字符串将变成0123456789012345678901234567890123456789 我该怎么做呢?您想将不同语言的数字转换成标准的阿拉伯语表示形式吗?我不认为标准PHP中存在这样的函数。所以,你得自己写。幸运的是,这并不难做到。只需创建非标准数字的散列,并将它们全部转换为标准。例如,此脚本将中文数字替换为阿拉伯语: <?php $a
我该怎么做呢?您想将不同语言的数字转换成标准的阿拉伯语表示形式吗?我不认为标准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;
是否要将不同语言的数字转换为标准的阿拉伯语表示形式?我不认为标准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;
我设法修复了我原来的方法,我认为这比维护大量转换要好
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);
}
我设法修复了我原来的方法,我认为这比维护大量转换要好
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);
}
如果您的PHP具有PHP_intl扩展名,则可以使用音译类
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";
当您需要规范化特定语言时,我在下面留下了我的初始代码
$devanagari2latin = Transliterator::create("Devanagari-Latin");
$bengali2latin = Transliterator::create("Bengali-Latin");
$original = "0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯";
echo $bengali2latin->transliterate($devanagari2latin->transliterate($original)), "\n";
如果您的PHP具有PHP_intl扩展名,则可以使用音译类
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";
当您需要规范化特定语言时,我在下面留下了我的初始代码
$devanagari2latin = Transliterator::create("Devanagari-Latin");
$bengali2latin = Transliterator::create("Bengali-Latin");
$original = "0123456789०१२३४५६७८९০১২৩৪৫৬৭৮৯";
echo $bengali2latin->transliterate($devanagari2latin->transliterate($original)), "\n";
? utf-8->ascii??utf-8->ascii?谢谢,如果你只担心一种或两种语言,这很有效,也很简单。谢谢,如果你只担心一种或两种语言,这很有效,也很简单。在这个特定的例子中,我们只有德夫纳加里语和孟加拉语。如果我们在混合中加入一些藏语呢?还是想实施一个通用解决方案?谢谢@Shervin。我误解了这个要求,所以修改了这个样本。我知道必须有一个图书馆来处理这个问题。现在我知道什么是音译了。糟糕的是,在5.3版本中,它不可用。在这个特定的例子中,我们只有德夫纳加里语和孟加拉语。如果我们在混合中加入一些藏语呢?还是想实施一个通用解决方案?谢谢@Shervin。我误解了这个要求,所以修改了这个样本。我知道必须有一个图书馆来处理这个问题。现在我知道什么是音译了。糟糕的是,它在5.3中不可用