Unicode Normalize
unicode_normalize · text · text
2026-09-23
กำลังประมวลผล…
unicode_normalize · text · text
2026-09-23
ข้อความสองค่าที่แสดงผลเหมือนกันอาจเก็บด้วยรหัสต่างกัน เช่น é ที่เป็นอักขระเดียว กับ e บวกเครื่องหมายเสียงแยกกัน หรือข้อความไทยที่มี zero-width space แทรกจากการคัดลอกเว็บ ผลคือค่าที่ควรเหมือนกันถูกนับแยกและ join ไม่ติด เทคนิคนี้จัดให้เป็นรูปแบบเดียวก่อนงานอื่นทั้งหมด
NFKC หรือ NFKD กับข้อมูลที่ต้องรักษารูปแบบตัวอักษรพิเศษ เพราะสองรูปแบบนี้จะแปลงตัวเลขยกกำลังและอักษรเต็มความกว้างให้กลายเป็นตัวธรรมดา และ เมื่อเปิด removeInvisibleNFC รวมอักขระกับเครื่องหมายเข้าด้วยกัน NFD แยกออกจากกัน ส่วน NFKC/NFKD แปลงอักขระที่เทียบเท่ากันเชิงรูปลักษณ์ด้วยภาษาไทยได้ประโยชน์จาก
NFCเป็นหลัก เพราะสระและวรรณยุกต์ที่พิมพ์สลับลำดับจะถูกจัดให้เป็นลำดับมาตรฐานเดียวกัน
| Parameter | Type | Default |
|---|---|---|
columns | string[] | — |
form | NFC | NFKC | NFD | NFKD | "NFC" |
removeInvisible | boolean | true |
import json
import re
import unicodedata
INVISIBLE = re.compile('[]')
def unicode_normalize(value, form='NFC', remove_invisible=True):
if not isinstance(value, str):
return value
cleaned = INVISIBLE.sub('', value) if remove_invisible else value
return unicodedata.normalize(form, cleaned)
values = ['Café', 'ไทย', None]
result = [unicode_normalize(value) for value in values]
print(json.dumps(result, ensure_ascii=False))
คอลัมน์ province มี 84 ค่าไม่ซ้ำ ทั้งที่ประเทศไทยมี 77 จังหวัด รัน unicode_normalize แบบ NFC พร้อมลบอักขระที่มองไม่เห็น แล้วดูจำนวนค่าไม่ซ้ำอีกครั้ง ถ้าลดลงเหลือ 77 แปลว่าปัญหาคือรหัสอักขระล้วน ๆ ถ้ายังเกิน ให้ไปต่อที่ Cluster Review เพื่อดูการสะกด
ใช้ collapse_spaces คู่กันเพราะทั้งคู่แก้ปัญหา "ค่าเหมือนกันแต่ถูกนับแยก" ใช้ find_similar_values ต่อเมื่อความต่างอยู่ที่การสะกด และใช้ remove_diacritics เมื่อต้องการตัดเครื่องหมายเสียงของอักษรละตินออกจริง ๆ