php 字串的編碼/解碼

2022101810:00
只有範例

  Unicode
<?php
$arr=[
  'title' =>"天氣不錯abc",
  'price'=>100
];
$json = json_encode($arr);
echo "$json";

結果: (Unicode 編碼)
{"title":"\u5929\u6c23\u4e0d\u932fabc","price":100}
 
<?php
$str = '"\u5929\u6c23\u4e0d\u932fabc"';  #特別注意:字串前後要加上雙引號 "
echo json_decode($str);

結果:
天氣不錯abc




UTF-8
<?php
echo preg_replace_callback("/./", function($matched) {
    return '\x'.dechex(ord($matched[0]));
}, '下大雨abc');

結果:
\xe4\xb8\x8b\xe5\xa4\xa7\xe9\x9b\xa8\x61\x62\x63

參考:
https://stackoverflow.com/questions/7320516/how-to-convert-text-to-x-codes
 
<?php
$str="\xe4\xb8\x8b\xe5\xa4\xa7\xe9\x9b\xa8\x61\x62\x63"; #注意: 字串前後是雙引號
echo $str;

結果: 
下大雨abc
 
<?php
$encoded = '\xe4\xb8\x8b\xe5\xa4\xa7\xe9\x9b\xa8\x61\x62\x63'; #注意: 字串前後是單引號
$hexadecimal = str_replace('\x', '', $encoded);

echo hex2bin($hexadecimal);
echo "\n";
echo pack('H*', $hexadecimal);

printf('%s', "\xe7\x94\x9f\xe6\x97\xa5\xe5\x84\xaa\xe6\x83\xa0");

結果:
下大雨abc
下大雨abc



 
<?php
$str='下大雨abc';
echo urlencode($str);

結果:
%E4%B8%8B%E5%A4%A7%E9%9B%A8abc

===================

$str='%E4%B8%8B%E5%A4%A7%E9%9B%A8abc';
echo urldecode($str);

結果:
下大雨abc



一些 &# 開頭的編碼
主要用於 HTML 網頁中來顯示
例如 &#38632   = 雨
 
<?php
//方法一
$str = '雨';
$str2 = base_convert(bin2hex(iconv('UTF-8', 'UCS-4', $str)), 16, 10); // 38632
echo $str2;

結果:
38632

//方法二
$str = '雨';
$str =  base_convert(bin2hex(mb_convert_encoding($str, 'ucs-4', 'utf-8')), 16, 10);
echo "$unicode_html\n";

==============
$str="&#38632;";
echo mb_convert_encoding($str, 'UTF-8', 'HTML-ENTITIES');

結果:
雨 

http://hinablue.blogspot.com/2008/01/php-tech-unicode-html-convert.html



參考:
Unicode 編碼轉換工具

[web] 瞭解網頁中看不懂的編碼:Unicode 在 JavaScript 中的使用

Unicode Character Table
這裡有列出/查詢所有 Unicode 的字集

每個軟體開發者都絕對一定要會的Unicode及字元集必備知識(沒有藉口!)

Unicode、UTF-8、UTF-16,終於懂了

Unicode 是一個符號集, 它只規定了每個符號的二進制值,但是符號具體如何存儲它並沒有規定

前面提到, Unicode 字符集的編碼範圍是 0x0000 - 0x10FFFF,因此需要 1 到 3 個字節來表示

那麼,對於三個字節的 Unicode 字符,計算機怎麼知道它表示的是一個字符而不是三個字符呢 ?

如果所有字符都用三個字節表示,那麼對於那些一個字節就能表示的字符來說,有兩個字節是無意義的,對於存儲來說,這是極大的浪費,假如 , 一個普通的文本, 大部分字符都只需一個字節就能表示,現在如果需要三個字節才能表示,文本的大小會大出三倍左右

因此,Unicode 出現了多種存儲方式,常見的有 UTF-8、UTF-16、UTF-32,它們分別用不同的二進制格式來表示 Unicode 字符

UTF-8、UTF-16、UTF-32 中的 "UTF" 是 "Unicode Transformation Format" 的縮寫,意思是 "Unicode 轉換格式",後面的數 字表明至少使用多少個比特位來存儲字符, 比如:UTF-8 最少需要 8 個比特位也就是一個字節來存儲,對應的, UTF-16 和 UTF-32 分別需要最少 2 個字節 和 4 個字節來存儲