def test_to_unicodestr(self): e = self.assertEqual a2b = unicodesupport._a_to_b # from utf8 rawstring testee = 'aiuえお♥' expect = u'aiuえお♥' e(expect, unicodesupport.to_unicodestr(testee)) # from sjis rawstring testee = 'aiuえお' expect = u'aiuえお' e(expect, unicodesupport.to_unicodestr(a2b(testee, 'utf8', 'sjis'))) # from ascii rawstring ascii_testee = 'abyz0189!"()<>+*' ascii_expect = u'abyz0189!"()<>+*' e(ascii_expect, unicodesupport.to_unicodestr(a2b(ascii_testee, 'utf8', 'ascii'))) # from not supported rawstring(ここではロシア語を使用) # 変換できないので入力文字列がそのまま返る. testee = 'Путин' invalid_encoding_testee = a2b(testee, 'utf8', 'koi8_r') actual = unicodesupport.to_unicodestr(invalid_encoding_testee) self.assertTrue(isinstance(actual, str)) e(invalid_encoding_testee, actual)
def deploy(self, s): """ 文字列 s 中のマクロを全て展開する. @param s rawstring @return utf8-rawstring """ ret = unicodesupport.to_unicodestr(s) #mark = Macro.MARK mark = unicodesupport.to_unicodestr(Macro.MARK) idx_start = 0 while True: # 始点を探す. 無ければ終了. idx_start = ret.find(mark, idx_start) if idx_start==-1: return unicodesupport.to_utf8_rawstring(ret) # 終点を探す. 無ければ終了. # 終点探索開始位置は始点から一つずらす(始点を含めないため) idx_end = ret.find(mark, idx_start+1) if idx_end==-1: return unicodesupport.to_utf8_rawstring(ret) # 始点終点間をマクロ名とみなして展開し, # 次の探索開始位置を確定. # ただしマクロ名は rawstring のみ対応のため変換しておく. macroname = ret[idx_start+1:idx_end] macroname = unicodesupport.to_utf8_rawstring(macroname) macrovalue = macroname # まずはユーザマクロから. try: macrovalue = self.usermacro.get(macroname) macrovalue = unicodesupport.to_unicodestr(macrovalue) ret = ret[0:idx_start] + \ macrovalue + \ ret[idx_end+1:] idx_start = idx_start + len(macrovalue) continue except KeyError: pass # ユーザマクロがダメならシステムマクロ. try: # 数値として取得されるものもあるが, # 後の処理では常に文字列として連結しようとするので # 文字列に変換しなければならない. macrovalue = str(self.systemmacro.get(macroname)) macrovalue = unicodesupport.to_unicodestr(macrovalue) ret = ret[0:idx_start] + \ macrovalue + \ ret[idx_end+1:] idx_start = idx_start + len(macrovalue) continue except KeyError: pass # 展開できなかったので諦めて次の位置から探索を継続. idx_start = idx_end + 1
def _appendmenu(self, target_id, option, this_id, itemname, use_unicode=False): f = win32gui.AppendMenu using_itemname = itemname if use_unicode: # ctype の AppendMenuW() には rawstring ではなく # unicode string を与える必要がある. f = ctypes.windll.User32.AppendMenuW using_itemname = unicodesupport.to_unicodestr(itemname) f(target_id, option, this_id, using_itemname)
def _get_clipboard_length(self): """ unicode string で計算するため半角全角日本語英語問わず1文字は1文字. """ return len( unicodesupport.to_unicodestr( self._get_clipboard() ) )
def _copy(self, rawstring): """ 指定文字列をクリップボードにコピーする. @retval True コピーした @retval False コピーできなかった """ if unicodesupport.is_ascii(rawstring): log.debug('COPY as ascii') return clipboard.Clipboard.set_ansi(rawstring) if unicodesupport.is_utf8_and_not_ascii(rawstring): log.debug('COPY as utf8') return clipboard.Clipboard.set_unicode( unicodesupport.to_unicodestr(rawstring) ) if unicodesupport.is_sjis_and_not_ascii(rawstring): log.debug('COPY as sjis') return clipboard.Clipboard.set_ansi(rawstring) log.debug('COPY as unknown-type') return clipboard.Clipboard.set_ansi(rawstring)
def if_str_then_to_sjis(rawstring): if not(isinstance(rawstring, str)): return rawstring import unicodesupport as u return u.to_sjis_rawstring(u.to_unicodestr(rawstring))