高分求解PHP問題


我的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中所顯示的編碼轉換問題。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com