เหตุใด Apache Commons จึงพิจารณาตัวเลข '१२३'


101

ตามเอกสารของ Apache Commons Lang สำหรับStringUtils.isNumeric()สตริง '१२३' เป็นตัวเลข

เนื่องจากฉันเชื่อว่านี่อาจเป็นข้อผิดพลาดในเอกสารฉันจึงทำการทดสอบเพื่อยืนยันคำชี้แจง ฉันพบว่าตาม Apache Commons มันเป็นตัวเลข

เหตุใดสายอักขระนี้จึงเป็นตัวเลข ตัวละครเหล่านั้นแสดงถึงอะไร?


61
บางทีอาจเป็นตัวแทนของตัวเลขในบางภาษา ไม่ใช่ทุกภาษาที่ใช้สัญลักษณ์ 0 ถึง 9 เพื่อแสดงตัวเลข
ศก

165
นี่คือ 1, 2 และ 3 ในภาษาฮินดี
Blip

11
Integer.parseInt("१२३")คุณจะได้รับค่าจำนวนเต็มโดย
saka1029

9
@ dan04 นี่ไม่ใช่ตัวเลข แต่เป็นตัวอักษรที่นิยมใช้แทนค่าคงที่เฉพาะ หมายเหตุ: ความแตกต่างระหว่างและⅯⅭ MC
gerrit

คำตอบ:


198

เนื่องจาก "CharSequence มีเฉพาะตัวเลข Unicode" (อ้างถึงเอกสารที่เชื่อมโยงของคุณ)

อักขระทั้งหมดคืนค่าจริงสำหรับCharacter.isDigit:

ช่วงอักขระ Unicode บางช่วงที่มีตัวเลข:

  • '\ u0030' ถึง '\ u0039', ISO-LATIN-1 หลัก ('0' ถึง '9')
  • '\ u0660' ถึง '\ u0669', เลขอารบิก - อินดิเคเตอร์
  • '\ u06F0' ถึง '\ u06F9', ตัวเลขตัวบ่งชี้ภาษาอาหรับแบบขยาย
  • '\ u0966' ถึง '\ u096F', หลักเทวนาครี
  • '\ uFF10' ถึง '\ uFF19', หลักเต็มความกว้าง

ช่วงอักขระอื่น ๆ มีตัวเลขเช่นกัน

१२३ เป็นหลักเทวนาครี:


11
@Joker_vD คุณไม่ได้ระบุว่าโอเวอร์โหลดใช่แน่นอน: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD มันไม่ยากเลย มีภาษาที่ไม่รองรับจำนวนมาก แม้ว่าจะเป็นเช่นนั้น แต่ก็มี Chinise 亿ซึ่งแสดงถึง 10 ^ 8 -> นี่คือพลังของ 3 จะทำให้เกิดการล้น รายการระบบตัวเลข
Cedric Reichenbach

13
@CedricReichenbach: ความแตกต่างที่สำคัญมีว่าในขณะที่亿เป็นตัวเลข (ตามมาตรฐานของการมีหนึ่งของที่ไม่ใช่ไม่มีค่า Numeric_Type ในกรณีนี้ Numeric_Type = ตัวเลข) มันไม่ได้เรียงลำดับใด ๆ ของหลัก (ถึงแม้ว่ามันจะเป็นคุณจะได้ใช้มันเพื่ออำนาจของ 3 นั้นคุณจะยกสมุฎฐานอำนาจต่าง ๆ ไม่ได้เป็นหลัก .) parseIntต้องมีตัวเลขและบางทีอาจจะทำให้เกิดความสับสนในisNumericวิธีการในการทดสอบของคำถามนี้สำหรับอักขระทศนิยมหลัก ( General_Category = Decimal_Number) แทนหมวดหมู่ที่กว้างขึ้นของอักขระตัวเลข
user2357112 รองรับ Monica

10
०१२३४५६७८९ชุดที่สมบูรณ์ของตัวเลขอักษรเทวนาครีคือ
dan04

2
@ v7d8dpo4 (s) เขาถามว่ามีวิธีในInteger.parseInt()การโยนข้อยกเว้นสำหรับสตริงอินพุตตัวเลข 3 อักขระหรือไม่
Andy Turner

59

สัญลักษณ์१२३เหมือนกับ 123 สำหรับภาษาเนปาลหรือภาษาอื่น ๆ ที่ใช้อักษรเทวนาครีเช่นฮินดีคุชราตและอื่น ๆ ดังนั้นจึงเป็นตัวเลขสำหรับ Apache Commons


3
สิ่งนั้นเกือบจะดูเหมือน "123" ในเลขอารบิค
Panzercrisis

41
ชาวอาหรับได้เลขมาจากชาวอินเดีย

5
@rahul ตัวเลขอารบิกคือ 1-9 ไม่ใช่ ١-٩ อย่างที่คิดกันทั่วไป
Maroun

26

คุณสามารถใช้Character#getTypeเพื่อตรวจสอบหมวดหมู่ทั่วไปของตัวละคร:

System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));

นี้จะพิมพ์trueซึ่งเป็น "หลักฐาน" ที่ '1' เป็นจำนวนหลัก

ตอนนี้เรามาตรวจสอบค่า Unicode ของอักขระ '१':

System.out.println(Integer.toHexString('१'));
// 967

หมายเลขนี้อยู่ในช่วงของตัวเลขเทวนาครี - ซึ่งเป็น: ผ่าน\u0966\u096F

ลองดู:

Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI

เทวนาครีคือ:

เป็นอักษร abugida (alphasyllabary) ของอินเดียและเนปาล

"१२३" คือ "123" (ยูนิโคดภาษาละตินพื้นฐาน)

การอ่าน:


1
มันสำคัญกว่าที่พวกเขาเป็นประเภทDECIMAL_DIGIT_NUMBERมากกว่าที่พวกเขาอยู่ในDEVANAGARIบล็อก มีตัวอักษรที่ไม่ใช่ตัวเลขอยู่ในบล็อกนั้นด้วย
Andy Turner

23

หากคุณต้องการทราบว่า "อักขระ" มีคุณสมบัติอะไรบ้าง (และมีไม่กี่ตัว) ให้ไปที่แหล่งที่มา: Unicode.orgโดยตรง พวกเขามีเครื่องมือวิจัยที่สามารถแสดงทุกสิ่งที่คุณอยากรู้

  • หากคุณต้องการดูคุณสมบัติทั้งหมดของอักขระเฉพาะให้ลองทำดังต่อไปนี้:

    http://unicode.org/cldr/utility/character.jsp?a=१

    หรือ:

    http://unicode.org/cldr/utility/character.jsp?a=%E0%A5%A7

  • หากคุณต้องการดูอักขระทั้งหมดที่จัดประเภทเป็น "หลักทศนิยม" (เช่นมีค่าตัวเลข 0 ถึง 9) ให้ลองทำดังต่อไปนี้:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]
    (550 Code Points - ปัจจุบัน / ณ Unicode 9.0)

  • หากคุณต้องการดูอักขระทั้งหมดที่จัดประเภทเป็น "ตัวเลขที่ไม่ใช่ทศนิยม" (เช่นเศษส่วนวงกลม ฯลฯ ) ให้ลองทำดังต่อไปนี้:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Numeric:]
    (คะแนนรหัส 836 - ปัจจุบัน / ณ Unicode 9.0)

  • หากคุณต้องการดูอักขระทั้งหมดที่จัดประเภทเป็น "เลขฐานสิบ" (เช่นมีค่าตัวเลข 0 ถึง 9) แต่ขึ้นผ่าน Unicode 6.0 เท่านั้น (ซึ่ง. NET ใช้)ให้ลองทำดังต่อไปนี้:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]
    (คะแนนรหัส 420 คะแนน - และไม่ควรเปลี่ยนแปลง)

  • หากคุณต้องการดูอักขระทั้งหมดที่จัดประเภทเป็น "หลักทศนิยม" (เช่นมีค่าตัวเลข 0 ถึง 9) แต่จะเพิ่มขึ้นผ่าน Unicode 6.0 เท่านั้น (ซึ่ง. NET ใช้) และเฉพาะในระนาบฐานหลายภาษา / ไม่มีอักขระเสริม ( เช่นไม่มีอะไรเหนือ Code Point 65535 / U + 0xFFFF)ให้ลองทำดังต่อไปนี้:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]%26[:bmp= Yeses:]
    (350 Code Points - - และไม่ควรเปลี่ยน)

เก็บไว้ในใจ: Unicode Consortium จัดทำข้อกำหนดไม่ใช่ซอฟต์แวร์ ซึ่งหมายความว่ามันขึ้นอยู่กับผู้จำหน่ายซอฟต์แวร์แต่ละที่จะใช้สเปคอย่างถูกต้องที่พวกเขาสามารถ เช่นเดียวกับ HTML, JavaScript, CSS, SQL และอื่น ๆ มีการเปลี่ยนแปลงระหว่างแพลตฟอร์มภาษาและอื่น ๆ ตัวอย่างเช่นฉันพบข้อบกพร่องใน. NET Framework ของ Microsoft โดยการวนตัวอักษรละตินA-Zและ a-z- Code Points 0x24B6 ถึง 0x24E9 - ลงทะเบียนไม่ถูกต้องว่าเป็นchar.IsLetter = true( รายงานข้อบกพร่องที่นี่ ) และนั่นนำไปสู่พฤติกรรมที่ไม่คาดคิดในฟังก์ชันการทำงานที่เกี่ยวข้องเช่นเมื่อเรียกใช้TextInfo.ToTitleCase()เมธอด ( รายงานข้อบกพร่องที่นี่ )


1
อ้างอิงเยี่ยม! (แม้ว่าพวกเขาจะทำให้ฉันสงสัยว่า Unicode ได้ก้าวไปสู่จุดสูงสุดแล้ว!)
PJTraill

1
หากคุณต้องการที่จะมีการเรียงลำดับของการอ้างอิงที่มีอยู่ในท้องถิ่นนี้คุณสามารถติดตั้งuniprops
TRiG

2
@TRiG ขอบคุณที่พูดถึงเรื่องนั้น ยูทิลิตี้ที่น่าสนใจ มันครอบคลุมฟังก์ชันบางอย่างที่แสดงใน 3 ลิงก์แรก (ชุดเดิม) แต่ฉันเพิ่งอัปเดตคำตอบของฉันเพื่อรวมลิงก์เพิ่มเติมบางส่วนที่แสดงการสืบค้นขั้นสูงเพิ่มเติมที่สามารถทำได้บน Unicode.org ซึ่งฉันไม่เห็นว่าเป็นไปได้ ผ่านuniprops. นอกจากนี้ดูเหมือนว่าunipropsจะเป็นเวอร์ชันที่อยู่เบื้องหลัง Unicode เวอร์ชัน 9.0 เมื่อเดือนมิถุนายนที่ผ่านมา
Solomon Rutzky

19

สัญลักษณ์ '१२३' มาจากภาษาฮินดีจริง ๆ (โดยพื้นฐานมาจากภาษาสันสกฤตคือเทวนาครี) ซึ่งแสดงถึงค่าตัวเลขเช่นเดียวกับ:

१ แสดงถึง 1

२ แสดงถึง 2

และชอบฉลาด


4
แก้ไข: สัญลักษณ์ '123' จะมาจริงจาก ภาษาสันสกฤต ภาษา (เช่นสคริปต์ Devanagiri โปสเตอร์อื่น ๆ ได้ระบุไว้)
มีความสุขสีเขียวเด็กงีบหลับ

ฉันรู้สึกประหลาดใจที่ได้ทราบว่าเมื่อเร็ว ๆ นี้เทวานาการ์อยู่ในรูปแบบปัจจุบัน - หลายศตวรรษหลังจากที่ภาษาสันสกฤตได้รับการเข้ารหัส! ดังนั้นฉันจึงสงสัยในการอ้างว่าตัวเลขเป็นภาษาสันสกฤตมากกว่าวัฒนธรรมอินเดียโดยทั่วไป
Anton Sherwood
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.