Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中将Unicode NCR格式转换为其原始格式?_Php_Unicode_Fpdf_Cjk - Fatal编程技术网

如何在PHP中将Unicode NCR格式转换为其原始格式?

如何在PHP中将Unicode NCR格式转换为其原始格式?,php,unicode,fpdf,cjk,Php,Unicode,Fpdf,Cjk,为了避免“怪物字符”,我选择Unicode NCR表单在数据库(MySQL)中存储非英语字符。然而,我使用的PDF插件(FPDF)不接受Unicode NCR格式作为正确的格式;它直接显示数据,如下所示: 這個一個例子 但我希望它显示为: 這個一個例子 是否有任何方法将Unicode NCR格式转换为其原始格式 p、 这个句子在繁体中文中的意思是“这是一个例子”

为了避免“怪物字符”,我选择Unicode NCR表单在数据库(MySQL)中存储非英语字符。然而,我使用的PDF插件(FPDF)不接受Unicode NCR格式作为正确的格式;它直接显示数据,如下所示:

這個一個例子
但我希望它显示为:

這個一個例子

是否有任何方法将Unicode NCR格式转换为其原始格式

p、 这个句子在繁体中文中的意思是“这是一个例子”

p、 我知道NCR表单浪费了存储空间,但它是存储非英语字符最安全的方法。如果我错了,请纠正我。谢谢。

看一看


PS:更好的方法是一直使用UTF-8。搜索关于PHP、MySQL和UTF-8的问题,有几个列出了可能的问题。

解决方案非常复杂

该解决方案有三个部分: 第1部分:安装FPDF中文插件 第2部分:将NCR格式转换为UTF-8 第3部分:将UTF-8格式转换为BIG5(或任何目标编码)

第一部分 我从这里获取了FPDF中文插件: 它用于在FPDF中显示汉字,并获取所需的所有中文字体。要安装此插件,只需将其包含在PHP中。(但在我的例子中,我使用了另一个名为CellPDF的插件,它与这个中文插件崩溃;因此,我必须合并代码并解决冲突)

第二部分 要将NCR格式转换为UTF-8,我使用以下代码:

function html_entity_decode_utf8($string)
{
    static $trans_tbl;

    // replace numeric entities
    $string = preg_replace('~&#x([0-9a-f]+);~ei', 'code2utf(hexdec("\\1"))', $string);
    $string = preg_replace('~&#([0-9]+);~e', 'code2utf(\\1)', $string);

    // replace literal entities
    if (!isset($trans_tbl))
    {
        $trans_tbl = array();

        foreach (get_html_translation_table(HTML_ENTITIES) as $val=>$key)
            $trans_tbl[$key] = utf8_encode($val);
    }

    return strtr($string, $trans_tbl);
}
function code2utf($num)
{
    if ($num < 128) return chr($num);
    if ($num < 2048) return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
    if ($num < 65536) return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
    if ($num < 2097152) return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
    return '';
}
因此,如果我想转换前一行NCR字符串,我只需要运行此函数:

ncr_decode("&#36889;&#20491;&#19968;&#20491;&#20363;&#23376;");
p、 默认情况下,我将目标编码设置为BIG5


就这样

有一个更简单的解决方案,使用PHP mbstring扩展

// convert any Decimal NCRs to Unicode characters
$string = "&#36889;&#20491;&#19968;&#20491;&#20363;&#23376;";
$output = preg_replace_callback(
  '/(&#[0-9]+;)/u', 
  function($m){
    return utf8_entity_decode($m[1]);
  }, 
  $string
);
echo $output; // 這個一個例子

//callback function for the regex
function utf8_entity_decode($entity){
  $convmap = array(0x0, 0x10000, 0, 0xfffff);
  return mb_decode_numericentity($entity, $convmap, 'UTF-8');
}

“utf8_entity_decode”函数来自PHP.net(Andrew Simpson):。我稍微修改了代码,以避免正则表达式中不推荐的“e”修饰符。

在FPDF下,恐怕解决方案不是那么容易。我正在接近解决方案。。。并且将在这里发布解决方案。嗯,FPDF似乎不支持除ISO-8859-1之外的任何东西(因此没有亚洲字符(?)。Steven Wittens编写了一个实验性的扩展来添加UTF8支持:如果您使用的是PHP版本>=4.3,您应该能够用
html\u entity\u decode
替换大部分代码,如果您告诉它,它甚至会以BIG5输出。或者我遗漏了什么?实际上,如果您将所有文本存储在UTF8中(注意它是从UTF8中的数据库中提取并作为UTF8处理的),那么您需要做的就是将其从UTF8转换为BIG5,以便通过FPDF输出,即完全跳过第2部分和第3部分。没有?实际上我使用UTF8在MySQL中存储文本数据,但如果跳过第2部分和第3部分,仍然会存在奇怪的字符。
// convert any Decimal NCRs to Unicode characters
$string = "&#36889;&#20491;&#19968;&#20491;&#20363;&#23376;";
$output = preg_replace_callback(
  '/(&#[0-9]+;)/u', 
  function($m){
    return utf8_entity_decode($m[1]);
  }, 
  $string
);
echo $output; // 這個一個例子

//callback function for the regex
function utf8_entity_decode($entity){
  $convmap = array(0x0, 0x10000, 0, 0xfffff);
  return mb_decode_numericentity($entity, $convmap, 'UTF-8');
}