วิธีนับคำและตัวอักษร
วางข้อความเดียวกันลงในสองแอป คุณอาจได้ตัวเลขสองค่าที่ไม่เท่ากัน ซึ่งไม่จำเป็นว่าค่าใดผิด เพราะทั้งสองนับสิ่งที่ต่างกัน คู่มือนี้อธิบายหน่วยที่ใช้บ่อยและเหตุผลที่ตัวเลขต่างกัน
สี่วิธีในการนับตัวอักษร
คอมพิวเตอร์เก็บข้อความเป็น Unicode และ "ตัวอักษร" หนึ่งตัววัดได้หลายระดับ
- Grapheme cluster คือสิ่งที่ผู้อ่านเห็นเป็นตัวอักษรหนึ่งตัว เช่น "é", "한" หรือ "👍🏽"
- Code point คือค่า Unicode แต่ละค่า ตัวอักษรที่มองเห็นหนึ่งตัวอาจประกอบด้วยหลาย code point
- หน่วยโค้ด UTF-16 คือสิ่งที่
lengthของ JavaScript และภาษาโปรแกรมอื่นอีกหลายภาษานับ อักขระที่อยู่นอก Basic Multilingual Plane รวมถึงอีโมจิส่วนใหญ่ ใช้สองหน่วย - ไบต์ UTF-8 คือสิ่งที่ไฟล์หรือคอลัมน์ฐานข้อมูลจัดเก็บ ตัวอักษร ASCII ใช้หนึ่งไบต์ ตัวอักษรละตินที่มีเครื่องหมายเสริมมักใช้สองไบต์ อักษรเกาหลี จีน และญี่ปุ่นมักใช้สามไบต์ และอีโมจิใช้สี่ไบต์ขึ้นไป
| ข้อความ | Grapheme | Code point | หน่วย UTF-16 | ไบต์ UTF-8 |
|---|---|---|---|---|
| a | 1 | 1 | 1 | 1 |
| é (code point เดียว) | 1 | 1 | 1 | 2 |
| é (e + เครื่องหมายเสริมแบบผสม) | 1 | 2 | 2 | 3 |
| 한 (พยางค์ภาษาเกาหลี) | 1 | 1 | 1 | 3 |
| 👍 | 1 | 1 | 2 | 4 |
| 👍🏽 (มีสีผิว) | 1 | 2 | 4 | 8 |
| 👨👩👧 (อีโมจิครอบครัว) | 1 | 5 | 8 | 18 |
เครื่องหมายเสริมแบบผสมและข้อความภาษาเกาหลี
อักขระบางตัวจัดเก็บได้มากกว่าหนึ่งแบบ "é" อาจเป็น code point เดียวที่ประกอบสำเร็จแล้ว หรือเป็น "e" ธรรมดาตามด้วยเครื่องหมายเสริมแบบผสม ทั้งสองดูเหมือนกันทุกประการ แต่แบบที่สองมี code point และไบต์มากกว่าหนึ่ง ข้อความที่คัดลอกมาจากบางระบบ เช่น ชื่อไฟล์ในระบบปฏิบัติการบางตัว อาจใช้รูปแบบที่แยกส่วน
ภาษาเกาหลีก็มีปัญหาเดียวกัน พยางค์อย่าง "한" มักจัดเก็บเป็น code point เดียว แต่ก็เขียนเป็นจาโมแยกกัน (ㅎ, ㅏ, ㄴ) ที่รวมกันบนหน้าจอได้ ตัวนับที่อิง grapheme จะแสดง 1 ในทั้งสองกรณี ส่วนการนับ code point จะได้ 1 หรือ 3 การทำ Unicode normalisation (NFC หรือ NFD) ใช้แปลงระหว่างสองรูปแบบนี้
การนับคำในภาษาต่าง ๆ
ในภาษาอังกฤษ การแบ่งคำตามช่องว่างให้จำนวนคำที่สมเหตุสมผล แม้ว่าคำที่มียัติภังค์ คำย่อ ตัวเลข และ URL อาจยังถูกนับต่างกันในแต่ละเครื่องมือ
ภาษาจีน ญี่ปุ่น และไทยมักเขียนโดยไม่เว้นวรรคระหว่างคำ การแบ่งตามช่องว่างจึงนับทั้งประโยคเป็นคำเดียว ตัวนับที่ดีกว่าจะใช้ระบบตัดคำที่อาศัยพจนานุกรมและกฎ ตัวนับของ LeedyBox ใช้ Intl.Segmenter ของเบราว์เซอร์ ซึ่งระบุขอบเขตคำได้ในหลายภาษา การตัดคำในภาษาเหล่านี้ขึ้นอยู่กับหลักเกณฑ์ที่ใช้ ผลลัพธ์จึงอาจต่างจากเครื่องมืออื่นหรือการนับของคน ด้วยเหตุนี้ผู้จัดพิมพ์บางรายในภาษาเหล่านี้จึงนับตัวอักษรแทนการนับคำ
ทำไมแอปและเว็บไซต์จึงนับต่างกัน
ขีดจำกัดอย่าง "สูงสุด 280 ตัวอักษร" หรือ "VARCHAR(255)" อาจวัดเป็น grapheme, code point, หน่วย UTF-16 หรือไบต์ ขึ้นอยู่กับระบบ บางบริการยังนับลิงก์เป็นความยาวคงที่ หรือถือว่าอักษรบางระบบมีน้ำหนักมากกว่า เมื่อต้องทำให้อยู่ในขีดจำกัด ให้ตรวจสอบว่าระบบปลายทางใช้หน่วยใด แล้วเปรียบเทียบกับตัวเลขนั้น ตัวนับของ LeedyBox แสดง grapheme หน่วย UTF-16 และไบต์ UTF-8 คู่กัน และมีตัวตรวจขีดจำกัด คุณจึงเห็นได้ว่าใกล้ขีดจำกัดแค่ไหนในหน่วยที่เกี่ยวข้อง
บรรทัด ย่อหน้า และการขึ้นบรรทัดใหม่
จำนวนบรรทัดขึ้นอยู่กับวิธีจัดเก็บการขึ้นบรรทัดใหม่ Windows มักใช้สองอักขระ (CR LF) ส่วน Linux และ macOS ใช้หนึ่งอักขระ (LF) เครื่องมือที่นับอักขระดิบอาจนับการขึ้นบรรทัดใหม่ของ Windows เป็นสองตัว การขึ้นบรรทัดใหม่ที่ท้ายข้อความอาจนับหรือไม่นับเป็นบรรทัดว่างเพิ่มอีกหนึ่งบรรทัดก็ได้ ย่อหน้ามักนับเป็นกลุ่มข้อความที่คั่นด้วยบรรทัดว่างหนึ่งบรรทัดขึ้นไป การขึ้นบรรทัดใหม่ครั้งเดียวภายในย่อหน้าจึงไม่ได้เริ่มย่อหน้าใหม่
เวลาอ่านโดยประมาณ
เวลาอ่านคำนวณโดยหารจำนวนคำด้วยความเร็วในการอ่านที่สมมติไว้ ความเร็วจริงแตกต่างกันไปตามผู้อ่าน ภาษา และความเป็นเทคนิคของข้อความ และจำนวนคำเองก็ขึ้นอยู่กับการตัดคำ จึงควรถือค่าประมาณนี้เป็นแนวทางคร่าว ๆ สำหรับการวางแผน ไม่ใช่การวัดผล
คำถามที่พบบ่อย
ทำไมอีโมจิหนึ่งตัวจึงนับเป็น 2 ตัวอักษรในบางแอป
แอปเหล่านั้นนับหน่วยโค้ด UTF-16 อีโมจิส่วนใหญ่จัดเก็บเป็นสองหน่วย และอีโมจิที่มีสีผิวหรือรวมหลายคนจะใช้มากกว่านั้น
ควรใช้การนับแบบใดสำหรับขีดจำกัดของคอลัมน์ฐานข้อมูล
ตรวจสอบเอกสารของฐานข้อมูล ขีดจำกัดบางแบบนับเป็นตัวอักษร และบางแบบนับเป็นไบต์ จำนวนไบต์ UTF-8 จึงมักเป็นค่าที่ควรใช้เปรียบเทียบ
ตัวนับส่งข้อความของฉันไปที่ใดหรือไม่
เครื่องมือนับคำและตัวอักษรของ LeedyBox ทำงานในเบราว์เซอร์ของคุณ ข้อความที่คุณวางจึงถูกนับบนอุปกรณ์ของคุณ