66>>> u2 = u('a') # LATIN SMALL LETTER A
77>>> u3 = u('\uFF12 ') # FULLWIDTH DIGIT TWO
88>>> u4 = u('\u0100 ') # LATIN CAPITAL LETTER A WITH MACRON
9- >>> unicode_util.Category.get(u1)
10- 'Nd'
11- >>> unicode_util.Category.get(u2)
12- 'Ll'
13- >>> unicode_util.Category.get(u3)
14- 'Nd'
15- >>> unicode_util.Category.get(u4)
16- 'Lu'
9+ >>> unicode_util.Category.get(u1) == u('Nd')
10+ True
11+ >>> unicode_util.Category.get(u2) == u('Ll')
12+ True
13+ >>> unicode_util.Category.get(u3) == u('Nd')
14+ True
15+ >>> unicode_util.Category.get(u4) == u('Lu')
16+ True
1717>>> unicode_util.Category.get(u2) == unicode_util.Category.LOWERCASE_LETTER
1818True
1919>>> try:
2020... beyond_bmp = u('\U00010100 ') # AEGEAN WORD SEPARATOR LINE
2121... except Exception:
2222... beyond_bmp = u('')
2323>>> if len(beyond_bmp) == 1: # We have a UCS4 build of Python
24- ... unicode_util.Category.get(beyond_bmp)
24+ ... cat_po = unicode_util.Category.get(beyond_bmp)
2525... else: # UCS2 build of Python; no non-BMP chars available
26- ... unicode_util.Category.OTHER_PUNCTUATION
27- 'Po'
26+ ... cat_po = unicode_util.Category.OTHER_PUNCTUATION
27+ >>> cat_po == u('Po')
28+ True
2829>>> unicode_util.is_letter(u1)
2930False
3031>>> unicode_util.is_letter(u2)
7273import bisect
7374import unicodedata # Python 2.5 onward
7475
75- from .util import UnicodeMixin , u
76+ from .util import UnicodeMixin , unicod , u
7677
7778
7879class Category (object ):
7980 """General category of a Unicode character.
8081
8182 See http://www.unicode.org/reports/tr18/#Categories"""
82- LETTER = "L"
83- UPPERCASE_LETTER = "Lu"
84- LOWERCASE_LETTER = "Ll"
85- TITLECASE_LETTER = "Lt"
86- MODIFIER_LETTER = "Lm"
87- OTHER_LETTER = "Lo"
88- MARK = "M"
89- NON_SPACING_MARK = "Mn"
90- SPACING_COMBINING_MARK = "Mc"
91- ENCLOSING_MARK = "Me"
92- NUMBER = "N"
93- DECIMAL_DIGIT_NUMBER = "Nd"
94- LETTER_NUMBER = "Nl"
95- OTHER_NUMBER = "No"
96- SYMBOL = "S"
97- MATH_SYMBOL = "Sm"
98- CURRENCY_SYMBOL = "Sc"
99- MODIFIER_SYMBOL = "Sk"
100- OTHER_SYMBOL = "So"
101- PUNCTUATION = "P"
102- CONNECTOR_PUNCTUATION = "Pc"
103- DASH_PUNCTUATION = "Pd"
104- OPEN_PUNCTUATION = "Ps"
105- CLOSE_PUNCTUATION = "Pe"
106- INITIAL_PUNCTUATION = "Pi"
107- FINAL_PUNCTUATION = "Pf"
108- OTHER_PUNCTUATION = "Po"
109- SEPARATOR = "Z"
110- SPACE_SEPARATOR = "Zs"
111- LINE_SEPARATOR = "Zl"
112- PARAGRAPH_SEPARATOR = "Zp"
113- OTHER = "C"
114- CONTROL = "Cc"
115- FORMAT = "Cf"
116- SURROGATE = "Cs"
117- PRIVATE_USE = "Co"
118- NOT_ASSIGNED = "Cn"
83+ LETTER = u ( "L" )
84+ UPPERCASE_LETTER = u ( "Lu" )
85+ LOWERCASE_LETTER = u ( "Ll" )
86+ TITLECASE_LETTER = u ( "Lt" )
87+ MODIFIER_LETTER = u ( "Lm" )
88+ OTHER_LETTER = u ( "Lo" )
89+ MARK = u ( "M" )
90+ NON_SPACING_MARK = u ( "Mn" )
91+ SPACING_COMBINING_MARK = u ( "Mc" )
92+ ENCLOSING_MARK = u ( "Me" )
93+ NUMBER = u ( "N" )
94+ DECIMAL_DIGIT_NUMBER = u ( "Nd" )
95+ LETTER_NUMBER = u ( "Nl" )
96+ OTHER_NUMBER = u ( "No" )
97+ SYMBOL = u ( "S" )
98+ MATH_SYMBOL = u ( "Sm" )
99+ CURRENCY_SYMBOL = u ( "Sc" )
100+ MODIFIER_SYMBOL = u ( "Sk" )
101+ OTHER_SYMBOL = u ( "So" )
102+ PUNCTUATION = u ( "P" )
103+ CONNECTOR_PUNCTUATION = u ( "Pc" )
104+ DASH_PUNCTUATION = u ( "Pd" )
105+ OPEN_PUNCTUATION = u ( "Ps" )
106+ CLOSE_PUNCTUATION = u ( "Pe" )
107+ INITIAL_PUNCTUATION = u ( "Pi" )
108+ FINAL_PUNCTUATION = u ( "Pf" )
109+ OTHER_PUNCTUATION = u ( "Po" )
110+ SEPARATOR = u ( "Z" )
111+ SPACE_SEPARATOR = u ( "Zs" )
112+ LINE_SEPARATOR = u ( "Zl" )
113+ PARAGRAPH_SEPARATOR = u ( "Zp" )
114+ OTHER = u ( "C" )
115+ CONTROL = u ( "Cc" )
116+ FORMAT = u ( "Cf" )
117+ SURROGATE = u ( "Cs" )
118+ PRIVATE_USE = u ( "Co" )
119+ NOT_ASSIGNED = u ( "Cn" )
119120
120121 @classmethod
121122 def get (cls , uni_char ):
122- """Return the general category code for the given Unicode character"""
123- uni_char = u (uni_char )
124- return unicodedata .category (uni_char )
123+ """Return the general category code (as Unicode string) for the given Unicode character"""
124+ uni_char = unicod (uni_char ) # Force to Unicode
125+ return unicod ( unicodedata .category (uni_char ) )
125126
126127
127128def is_letter (uni_char ):
128129 """Determine whether the given Unicode character is a Unicode letter"""
129- uni_char = u (uni_char )
130- category = unicodedata .category (uni_char )
130+ category = Category .get (uni_char )
131131 return (category == Category .UPPERCASE_LETTER or
132132 category == Category .LOWERCASE_LETTER or
133133 category == Category .TITLECASE_LETTER or
@@ -153,7 +153,7 @@ def __hash__(self):
153153 return hash ((self .start , self .end ))
154154
155155 def __unicode__ (self ):
156- return u ("Block[%04x, %04x]" ) % (self .start , self .end )
156+ return unicod ("Block[%04x, %04x]" ) % (self .start , self .end )
157157
158158
159159class Block (object ):
@@ -377,7 +377,7 @@ class Block(object):
377377 @classmethod
378378 def get (cls , uni_char ):
379379 """Return the Unicode block of the given Unicode character"""
380- uni_char = u (uni_char )
380+ uni_char = unicod (uni_char ) # Force to Unicode
381381 code_point = ord (uni_char )
382382 if Block ._RANGE_KEYS is None :
383383 Block ._RANGE_KEYS = sorted (Block ._RANGES .keys ())
@@ -398,7 +398,7 @@ def digit(uni_char, default_value=None):
398398 """Returns the digit value assigned to the Unicode character uni_char as
399399 integer. If no such value is defined, default is returned, or, if not
400400 given, ValueError is raised."""
401- uni_char = u (uni_char )
401+ uni_char = unicod (uni_char ) # Force to Unicode.
402402 if default_value is not None :
403403 return unicodedata .digit (uni_char , default_value )
404404 else :
0 commit comments