Skip to content

Commit 0fd60a0

Browse files
committed
Make Unicode utilities deal entirely with Unicode strings
1 parent 71fdf18 commit 0fd60a0

1 file changed

Lines changed: 57 additions & 57 deletions

File tree

python/phonenumbers/unicode_util.py

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,26 @@
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
1818
True
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)
2930
False
3031
>>> unicode_util.is_letter(u2)
@@ -72,62 +73,61 @@
7273
import bisect
7374
import unicodedata # Python 2.5 onward
7475

75-
from .util import UnicodeMixin, u
76+
from .util import UnicodeMixin, unicod, u
7677

7778

7879
class 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

127128
def 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

159159
class 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

Comments
 (0)