根据How to determine whether a character is a letter in Java?的答案我正在使用 如果字符串在开头是否包含unicode字母,则匹配下面的代码片段。它在java 6上工作得很好,其中unicode字符 \ u0374未被视为unicode lettter
boolean test = "\u0374100".matches("[\\p{L}].*");; returns true on java 7 whereas it return false java 6.
对于这种观点,java 7是否有任何变化?如果是,如何使Java 6的东西在java 7上工作?
答案 0 :(得分:3)
根据Fileformat.Info: Unicode Character 'GREEK NUMERAL SIGN' (U+0374),类别为“ Letter ,修饰符[Lm]”。它还说Character.isLetter()
的结果是是。
现在将其与Unicode Character 'GREEK LOWER NUMERAL SIGN' (U+0375)进行对比,其中类别为“符号,修饰符[Sk]”。根据该页面,Character.isLetter()
的结果为否。
Java 7根据Character javadoc和Internationalization Enhancements in Java SE 7使用Unicode 6.0.0,而Java 6使用Unicode 4.0(请参阅Character javadoc和Java Language Specification 5.0(适用于两者) Java 5和6))。
原因是unicode现在将U + 0374定义为“Letter,Modifier”。查看Unicode 4.0.0和Unicode 6.0.0的unicode数据库,很明显,定义从 Sk 更改为 Lm :
版本4.0:
0374; GREEK NUMERAL SIGN; Sk ; 0; ON; 02B9 ;;;; N; GREEK UPPER NUMERAL SIGN; Dexia keraia ;;;
版本6.0.0:
0374; GREEK NUMERAL SIGN; Lm ; 0; ON; 02B9 ;;;; N; GREEK UPPER NUMERAL SIGN ;;;;
换句话说:你的正则表达式工作正常,只是字符定义已经改变,所以它现在被认为是一个字母,而不是一个符号。