<?php $a = <<<TXT
《破坏性加氢》(加氢裂化)具有碳-碳酸断裂、同时把氢气加入断裂部分而产生高和低沸点产品的特征。这就需要苛刻的反应温度(通常约为360~377℃(680~710 F)的范围)。
TXT;$s = <<< TXT
《破坏性加氢》
TXT;
//转utf-8码
$s1 = iconv('gbk','utf-8',"$s");$ch = current(unpack('H*', $s1));//每6位加一个空格
$ch = chunk_split("$ch","6"," ");//首位加一个空格
$ch = " "."$ch";//把' e'(空格e)替换成' u8e'(空格u8e)
$r = ltrim(str_replace(' e',' u8e',$ch));echo $r;?>打印结果:
u8e3808a u8e7a0b4 u8e59d8f u8e680a7 u8e58aa0 u8e6b0a2 u8e3808b 我这里逻辑只能处理全是中文字符的,遇到其中有单字节的就处理不了了。
例如转$a的结果就不像这样有规律。
我的想法就是把一段话转换成utf8码后,每个u8码的起始字母是e,我就再把每个u8码的起始的字母'e'替换成' u8e'。

解决方案 »

  1.   

    对于$s = <<< TXT
    《破坏性加氢》
    TXT;//转utf-8码
    $s1 = iconv('gbk','utf-8',"$s");
    preg_match_all('/./u', $s1, $r);
    foreach($r[0] as &$v) $v = current(unpack('H*', $v));
    echo 'u8' . join(' u8', $r[0]);有
    u8e3808a u8e7a0b4 u8e59d8f u8e680a7 u8e58aa0 u8e6b0a2 u8e3808b于是对于
    $s = <<<TXT
    《破坏性加氢》(加氢裂化)具有碳-碳酸断裂、同时把氢气加入断裂部分而产生高和低沸点产品的特征。这就需要苛刻的反应温度(通常约为360~377℃(680~710 F)的范围)。
    TXT;有
    u8e3808a u8e7a0b4 u8e59d8f u8e680a7 u8e58aa0 u8e6b0a2 u8e3808b u828 u8e58aa0 u8e6b0a2 u8e8a382 u8e58c96 u829 u8e585b7 u8e69c89 u8e7a2b3 u82d u8e7a2b3 u8e985b8 u8e696ad u8e8a382 u8e38081 u8e5908c u8e697b6 u8e68a8a u8e6b0a2 u8e6b094 u8e58aa0 u8e585a5 u8e696ad u8e8a382 u8e983a8 u8e58886 u8e8808c u8e4baa7 u8e7949f u8e9ab98 u8e5928c u8e4bd8e u8e6b2b8 u8e782b9 u8e4baa7 u8e59381 u8e79a84 u8e789b9 u8e5be81 u8e38082 u8e8bf99 u8e5b0b1 u8e99c80 u8e8a681 u8e88b9b u8e588bb u8e79a84 u8e58f8d u8e5ba94 u8e6b8a9 u8e5baa6 u828 u8e9809a u8e5b8b8 u8e7baa6 u8e4b8ba u833 u836 u830 u87e u833 u837 u837 u8e28483 u828 u836 u838 u830 u87e u837 u831 u830 u820 u846 u829 u8e79a84 u8e88c83 u8e59bb4 u829 u8e38082
      

  2.   

    u8就算是一个标示吧。
    对于下面的解码2楼大神的方法后面的编码乱了。$a = <<<TXT
    《破坏性加氢》(加氢裂化)具有碳-碳酸断裂、同时把氢气加入断裂部分而产生高和低沸点产品的特征。这就需要苛刻的反应温度(通常约为360~377℃(680~710 F)的范围)。
    TXT; u833 u836 u830 u87e u833 u837 u837 u8e28483 u828 u836 u838 u830 u87e u837 u831 u830 u820 u846 u829 u8e79a84 u8e88c83 u8e59bb4 u829 u8e38082我只想着只转换中文或者中文标点,双字节的。英文,数字,英文标点等单字节的就不转换。
      

  3.   

    你的问题在于utf-8只有3字节的才是以e开头,而英文,欧洲字符,符号都不在3字节区,
    大部分汉字(cjk)在3字节区,但是也有4字节的,尽管都是冷僻字
    所以你的
    $r = ltrim(str_replace(' e',' u8e',$ch))
    是不能用的
      

  4.   

    我是这样想的,每个中文类字符转成u8码就是6个字节,然后每6个字节都添加了一个空格,所以每个中文类字符转成u8码之后,开头都是‘ e’(空格+英文字母e),然后我再把这个替换成‘ u8e’。
    那这样说这种转码是不适用的了?把英文,数字,单字节标点过滤掉不替换,只替换中文类字符可以么?
      

  5.   

    把英文,数字,单字节标点过滤掉不替换,只替换中文类字符可以么?
    ----------------
    这个取决于你的需求utf8其实很有规律,就下面这几种,你只要照这个分析就行
    0xxxxxxx
    110xxxxx 10xxxxxx
    1110xxxx 10xxxxxx 10xxxxxx
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    当然比你上面的复杂点,但是能够确保对所有utf8字符无问题
      

  6.   

    活人还能被尿憋死了?$a = <<<TXT
    《破坏性加氢》(加氢裂化)具有碳-碳酸断裂、同时把氢气加入断裂部分而产生高和低沸点产品的特征。这就需要苛刻的反应温度(通常约为360~377℃(680~710 F)的范围)。
    TXT;$s1 = iconv('gbk','utf-8',"$a");
    preg_match_all('/./u', $s1, $r);
    foreach($r[0] as &$v) if(strlen($v)>=3) $v = 'u8' . current(unpack('H*', $v));
    echo join(' ', $r[0]);
    u8e3808a u8e7a0b4 u8e59d8f u8e680a7 u8e58aa0 u8e6b0a2 u8e3808b ( u8e58aa0 u8e6b0a2 u8e8a382 u8e58c96 ) u8e585b7 u8e69c89 u8e7a2b3 - u8e7a2b3 u8e985b8 u8e696ad u8e8a382 u8e38081 u8e5908c u8e697b6 u8e68a8a u8e6b0a2 u8e6b094 u8e58aa0 u8e585a5 u8e696ad u8e8a382 u8e983a8 u8e58886 u8e8808c u8e4baa7 u8e7949f u8e9ab98 u8e5928c u8e4bd8e u8e6b2b8 u8e782b9 u8e4baa7 u8e59381 u8e79a84 u8e789b9 u8e5be81 u8e38082 u8e8bf99 u8e5b0b1 u8e99c80 u8e8a681 u8e88b9b u8e588bb u8e79a84 u8e58f8d u8e5ba94 u8e6b8a9 u8e5baa6 ( u8e9809a u8e5b8b8 u8e7baa6 u8e4b8ba 3 6 0 ~ 3 7 7 u8e28483 ( 6 8 0 ~ 7 1 0 F ) u8e79a84 u8e88c83 u8e59bb4 ) u8e38082
      

  7.   

    不懂unpack参数.有空详细研究下这函数各种应用..