Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Java Unicode NCR 處理
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Brian Hsu
January 03, 2013
Programming
1
420
Java Unicode NCR 處理
Java 中 Unicode NCR 的轉換與處理
Brian Hsu
January 03, 2013
Tweet
Share
More Decks by Brian Hsu
See All by Brian Hsu
我如何停止憂慮並愛上 Non-MVC Web Framework @ OSDC.tw 2013
brianhsu
6
3.3k
數位典藏聯合目錄搜尋引擎模組
brianhsu
0
170
Java XML Processing
brianhsu
0
83
如何在 Java App 中導入 Scala @ JavaTWO 2011
brianhsu
1
130
[LT] 自由軟體讓你五分鐘上新聞 @ OSDC.tw 2011
brianhsu
1
99
ScalaTest-連貓都會的單元測試與 BDD @ COSCUP 2010
brianhsu
0
290
Introduction to Scala @ TWJUG 2010/07
brianhsu
1
190
Programming Android Application in Scala @ OSDC.tw 2010
brianhsu
1
120
Other Decks in Programming
See All in Programming
モジュラモノリスにおける境界をGoのinternalパッケージで守る
magavel
0
3.5k
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
540
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.9k
「抽象に依存せよ」が分からなかった新卒1年目の私が Goのインターフェースと和解するまで
kurogenki
0
110
CSC307 Lecture 14
javiergs
PRO
0
470
2026年は Rust 置き換えが流行る! / 20260220-niigata-5min-tech
girigiribauer
0
230
Claude Code の Skill で複雑な既存仕様をすっきり整理しよう
yuichirokato
1
360
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
220
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
540
Ruby x Terminal
a_matsuda
7
590
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
400
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
890
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
200
Optimizing for Happiness
mojombo
378
71k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
170
Navigating Team Friction
lara
192
16k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.8k
Odyssey Design
rkendrick25
PRO
2
540
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
390
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
61
52k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
400
WENDY [Excerpt]
tessaabrams
9
36k
Transcript
Unicode NCR 處理 BrianHsu
[email protected]
基本的概念 • 電腦是二進位,只能儲存 0/1 兩種狀態 • 使用對於 bit 的解讀來存放不同類型的資料 –
整數(二補數) – 浮點數( IEEE754 ) – 字元
ASCII • 使用一個 BYTE 來儲存字元 • 1byte=8bit=2^8=256 種狀態 • ASCII
針對前 128 個有統一的定義 – 剩下的 128 個由各系統自行決定應用 • A=65 、 B=66 、 C=67... • 0=48 、 1=49 、 2=50.... – 剩下的 128 個字元,由 CodePage 決定如何解讀
CJK 字元的儲存 • ASCII 使用的 1 個 byte=256 個字元對英文語 系很夠用,但漢字圈的字元多達上萬個
– Unicode 3.1 收錄超過七萬個 • 使用兩個 Byte 來儲存非 ASCII 內定義的字元
萬碼奔騰的年代 • 繁體中文: BIG5 • 簡體中文: GB2312 • 日文: EUC-JP/Shift_JIS...
• BIG5 – 聯合目錄現行 XML 交換編碼 – 以 1 個 byte 儲存 ASCII 範圍字元 – 以 2 個 byte 儲存中文字元 – 缺字問題 • 堃、喆……等
Unicode 編碼
Unicode 解決的問題 • 解決各系統編碼不同的問題 – 只要有字型,可以同時顯示不同國家的語言,如中 日韓混合 • 已成為網際網路實質標準 •
收錄的漢字比 BIG5 多很多 – 堃、喆
Unicode 的基本概念 • 每個字元對應到一個抽象的 CodePoint – CodePoint 是整數數值 – CodePoint
是抽象的,不是實際上儲存的值 • 為了與 ASCII 相容、 ASCII 內的字元數值和 Unicode 裡的 CodePoint 相同 – A=0x0041=65 – B=0x0042=66 • 其他的字元範例 – 公 =0x516C=20844 – 喆 =0x5586=21894
沒有 「儲存為 Unicode 」 這種事!!
Unicode 實際儲存時 • Unicode CointPoint 是抽象的! • 儲存時需要依照編碼規則儲存 – UTF-8
– UTF-16BE – UTF-16LE
UTF-8 • 網際網路上的實質資料交換標準 • 使用 1~4 個 byte 來儲存 –
與 ASCII 相容,在 ASCII 範圍內的字使用 1 個 byte 儲存 – 其於字元視需要使用2~4個 byte 來儲存
UTF-16BigEndean • Java 內部字元的儲存方式 – Java 裡 1 char =
2byte • 固定使用 2 個 byte 的倍數 – 一個 UnicodePoint 存為 2 個 byte – 一個 UnicodePoint 存為 4 個 byte • 若 CodePoint 是在 2^16=65535 內 – 直接儲存 CodePoint 轉二進位後的值 – A=0x0041 – 堃 =0x5B03
UTF-16BigEndean • 若字元的 CodePoint 超過 65535 • 使用兩個 Byte 表示
– 並非直接對應 CodePoint ,需經過編碼 – 編碼過後的第一個 Byte 必定為 HighSurrogate 範圍 內 (0xD800–0xDBFF) – 言㐌 • CodePoint 0x279A7 • 實際編碼 – 0xD85E 0xDDA7
NCR • Numeric character reference • 使用 Unicode 的 CodePoint
來表示字元 – 用在 XML/HTML 中 – 可以在非 UTF-8/UTF-16 編碼的文件中,表示 Unicode 的字元 • 型式 – 堃 // 十進位 – �x5803; // 十六進位 – 堃 // 十六進位
NCR • 可以在 Big5 的文件中表示出 Big5 中沒有的字 • 例: –
<Title> 游鍚 堃</Title> – <Author> 陶 喆</Author>
從 NCR 轉回 UTF-16 • 不要自己做! • 光是 CodePoint 在
65535 以上字元編碼就很 麻煩而且容易出錯 • 使用 Apache Commons Language 函式庫 – JAR檔連結 – JavaDoc API
從 NCR 轉回 UTF-16 import org.apache.commons.lang3.StringEscapeUtils; public class Test {
public static void main(String [] args) { String str1 = " 游鍚 堃 與陶 喆"; String str2 = StringEscapeUtils.unescapeXml(str1); String str3 = "𧦧 懷 "; String str4 = StringEscapeUtils.unescapeXml(str3); System.out.println(str2); System.out.println(str4); } }
將 BIG5 中沒有的字轉成 NCR • 「游鍚堃」轉成「游鍚堃 堃 」 • 將字串轉為字元陣列
– 記得有一個 Unicode 字元對應到四個 Byte 的狀態 – 把字元陣列掃過一次 • 先確定是否為 CodePoint 的開頭 • 如果是的話 – 檢查是否為 Big5 中的字元,如果不是就轉成 NCR • 如果不是的話 – 這是四個 Byte 的狀態的尾巴二個 byte ,不理他 • 參照 tw.digitalarchives.util.TextUtil
將 BIG5 中沒有的字轉成 NCR import tw.digitalarchives.util.TextUtil; public class Test {
public static void main(String [] args) { String str1 = " 游鍚堃與陶喆 "; String str2 = " 懷 "; String str3 = TextUtil.normalizeString(str1); String str4 = TextUtil.normalizeString(str2); System.out.println(str3); System.out.println(str4); } }
參考資料 • Unicode Code Point列表 • Unicode Code Point查詢