高分求解PHP问题

时间:2021-03-11 10:28:57
我的PHP、UTF-8页面条件下如何实现字串与unicode互换,即如下面这种的

U+  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  
----------------------------------------------------- 
8F60 轠 轡 轢 轣 轤 轥 车 轧 轨 轩 轪 轫 转 轭 轮 软 
8F70 轰 轱 轲 轳 轴 轵 轶 轷 轸 轹 轺 轻 轼 载 轾 轿 
8F80 辀 辁 辂 较 辄 辅 辆 辇 辈 辉 辊 辋 辌 辍 辎 辏 

......

如我想获取“车”的“8F66”;反之用“8F66”取加“车”。这是一个字互换,那么一段混合字串(关键点)呢

11 个解决方案

#1


引用楼主 yiwusuo 的帖子:
这是一个字互换,那么一段混合字串(关键点)呢

函数strtr

lz是否知道mediawiki的中文繁简转换功能?
用的就是这个函数,比较适合你这种情况,不妨看看它的代码。

如果是标准字符转换,前面的帖子已经作了说明
http://topic.csdn.net/u/20081118/18/c1bac1bd-c4b9-4a94-8244-228ee601b984.html?seed=1531169566

#2


如我想获取“车”的“8F66”;反之用“8F66”取加“车”。这是一个字互换,那么一段混合字串(关键点)呢?

想请教一下你是如何将8F66变成车的?
第二个,如果是混合的,秘须先用正则提取二字节16制码,一个一个生成字符

混取好象是不可能的!

#3


写个算法 你这个是固定的没有组合关系
生成一个php里面的数组,如$array = new Array("8F66"=>'车',...);
最好是生成多个数组,像字典那样可以检索

#4


在网上查到这个取汉字的unicode码 函数,但只能取单个汉字,且没给出反取办法。

function getUnicodeFromOneUTF8($word) {
  //获取其字符的内部数组表示,所以本文件应用utf-8编码!
  if (is_array( $word))
    $arr = $word;
  else  
    $arr = preg_split('//', $word, -1, PREG_SPLIT_NO_EMPTY);
  //此时,$arr应类似array(228, 189, 160)
  //定义一个空字符串存储
  $bin_str = '';
  //转成数字再转成二进制字符串,最后联合起来。
  foreach ($arr as $value)
    $bin_str .= decbin(ord($value));
  //此时,$bin_str应类似111001001011110110100000,如果是汉字"你"
  //正则截取
  $bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/','$1$2$3', $bin_str);
  //此时, $bin_str应类似0100111101100000,如果是汉字"你"
  //return bindec($bin_str); //返回类似20320,汉字"你"
  return dechex(bindec($bin_str)); //如想返回十六进制4f60,用这句
}
echo '<br />';

$v='你';
echo getUnicodeFromOneUTF8($v); //得到unicode码4f60

#5


iconv

#6


mark学习下

#7


引用 2 楼 fxs_2008 的回复:
如我想获取“车”的“8F66”;反之用“8F66”取加“车”。这是一个字互换,那么一段混合字串(关键点)呢?

想请教一下你是如何将8F66变成车的?
第二个,如果是混合的,秘须先用正则提取二字节16制码,一个一个生成字符

混取好象是不可能的!


你这是一个典型的Unicode<=>Ascii互换问题。
按照下面的代码,用strtr就可以简单的做到。
但是,需要做两个互换字符的数组。
已经存在县有数据的情况下,写个小程序,自动生成互换数组的代码不成问题。



$data= array(
'\u30c6'=>'全',
'\u30c7'=>'字');
var_dump(strtr('\u30c6中文\u30c7', $data));



注意:
1.不要轻易用正则
2.PHP对单个字符操作的API很少,尽可能用整体转换的函数

#8


测试了一下楼上froole兄的,可以输出,应能满足楼主应用
但直接输出'\u30c6',不行

我记不清了\u30c6哪种编码了,unicode码还是utf-8,还是html的内码?

#9


4楼的在文件是utf-8的情况下通过,但如果不是utf-8的不行

另外,如果知道一个字符的unidcode码,如何输字符:如4f60 输出‘你’

#10


4楼的,如果文件是ISO-8859-1
,下面的这个就不行,不知为什么?

$v=iconv("ISO-8859-1", "UTF-8", "你");

echo getUnicodeFromOneUTF8($v); //得到unicode码4f60 

#11


引用 8 楼 fxs_2008 的回复:
测试了一下楼上froole兄的,可以输出,应能满足楼主应用
但直接输出'\u30c6',不行

我记不清了\u30c6哪种编码了,unicode码还是utf-8,还是html的内码?


不是不能输出,而是你显示不了。
lz要的功能感觉像java中native2ascii实现的功能,
而不是普通的在HTML中所显示的编码转换问题。

#1


引用楼主 yiwusuo 的帖子:
这是一个字互换,那么一段混合字串(关键点)呢

函数strtr

lz是否知道mediawiki的中文繁简转换功能?
用的就是这个函数,比较适合你这种情况,不妨看看它的代码。

如果是标准字符转换,前面的帖子已经作了说明
http://topic.csdn.net/u/20081118/18/c1bac1bd-c4b9-4a94-8244-228ee601b984.html?seed=1531169566

#2


如我想获取“车”的“8F66”;反之用“8F66”取加“车”。这是一个字互换,那么一段混合字串(关键点)呢?

想请教一下你是如何将8F66变成车的?
第二个,如果是混合的,秘须先用正则提取二字节16制码,一个一个生成字符

混取好象是不可能的!

#3


写个算法 你这个是固定的没有组合关系
生成一个php里面的数组,如$array = new Array("8F66"=>'车',...);
最好是生成多个数组,像字典那样可以检索

#4


在网上查到这个取汉字的unicode码 函数,但只能取单个汉字,且没给出反取办法。

function getUnicodeFromOneUTF8($word) {
  //获取其字符的内部数组表示,所以本文件应用utf-8编码!
  if (is_array( $word))
    $arr = $word;
  else  
    $arr = preg_split('//', $word, -1, PREG_SPLIT_NO_EMPTY);
  //此时,$arr应类似array(228, 189, 160)
  //定义一个空字符串存储
  $bin_str = '';
  //转成数字再转成二进制字符串,最后联合起来。
  foreach ($arr as $value)
    $bin_str .= decbin(ord($value));
  //此时,$bin_str应类似111001001011110110100000,如果是汉字"你"
  //正则截取
  $bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/','$1$2$3', $bin_str);
  //此时, $bin_str应类似0100111101100000,如果是汉字"你"
  //return bindec($bin_str); //返回类似20320,汉字"你"
  return dechex(bindec($bin_str)); //如想返回十六进制4f60,用这句
}
echo '<br />';

$v='你';
echo getUnicodeFromOneUTF8($v); //得到unicode码4f60

#5


iconv

#6


mark学习下

#7


引用 2 楼 fxs_2008 的回复:
如我想获取“车”的“8F66”;反之用“8F66”取加“车”。这是一个字互换,那么一段混合字串(关键点)呢?

想请教一下你是如何将8F66变成车的?
第二个,如果是混合的,秘须先用正则提取二字节16制码,一个一个生成字符

混取好象是不可能的!


你这是一个典型的Unicode<=>Ascii互换问题。
按照下面的代码,用strtr就可以简单的做到。
但是,需要做两个互换字符的数组。
已经存在县有数据的情况下,写个小程序,自动生成互换数组的代码不成问题。



$data= array(
'\u30c6'=>'全',
'\u30c7'=>'字');
var_dump(strtr('\u30c6中文\u30c7', $data));



注意:
1.不要轻易用正则
2.PHP对单个字符操作的API很少,尽可能用整体转换的函数

#8


测试了一下楼上froole兄的,可以输出,应能满足楼主应用
但直接输出'\u30c6',不行

我记不清了\u30c6哪种编码了,unicode码还是utf-8,还是html的内码?

#9


4楼的在文件是utf-8的情况下通过,但如果不是utf-8的不行

另外,如果知道一个字符的unidcode码,如何输字符:如4f60 输出‘你’

#10


4楼的,如果文件是ISO-8859-1
,下面的这个就不行,不知为什么?

$v=iconv("ISO-8859-1", "UTF-8", "你");

echo getUnicodeFromOneUTF8($v); //得到unicode码4f60 

#11


引用 8 楼 fxs_2008 的回复:
测试了一下楼上froole兄的,可以输出,应能满足楼主应用
但直接输出'\u30c6',不行

我记不清了\u30c6哪种编码了,unicode码还是utf-8,还是html的内码?


不是不能输出,而是你显示不了。
lz要的功能感觉像java中native2ascii实现的功能,
而不是普通的在HTML中所显示的编码转换问题。