require 'windows/api' require 'windows/msvcrt/string' include Windows module Windows module Unicode include Windows::MSVCRT::String API.auto_namespace = 'Windows::Unicode' API.auto_constant = true API.auto_method = true API.auto_unicode = false CP_ACP = 0 CP_OEMCP = 1 CP_MACCP = 2 CP_THREAD_ACP = 3 CP_SYMBOL = 42 CP_UTF7 = 65000 CP_UTF8 = 65001 MB_PRECOMPOSED = 0x00000001 MB_COMPOSITE = 0x00000002 MB_USEGLYPHCHARS = 0x00000004 MB_ERR_INVALID_CHARS = 0x00000008 WC_COMPOSITECHECK = 0x00000200 WC_DISCARDNS = 0x00000010 WC_SEPCHARS = 0x00000020 WC_DEFAULTCHAR = 0x00000040 WC_NO_BEST_FIT_CHARS = 0x00000400 ANSI_CHARSET = 0 DEFAULT_CHARSET = 1 SYMBOL_CHARSET = 2 SHIFTJIS_CHARSET = 128 HANGEUL_CHARSET = 129 HANGUL_CHARSET = 129 GB2312_CHARSET = 134 CHINESEBIG5_CHARSET = 136 OEM_CHARSET = 255 JOHAB_CHARSET = 130 HEBREW_CHARSET = 177 ARABIC_CHARSET = 178 GREEK_CHARSET = 161 TURKISH_CHARSET = 162 VIETNAMESE_CHARSET = 163 THAI_CHARSET = 222 EASTEUROPE_CHARSET = 238 RUSSIAN_CHARSET = 204 IS_TEXT_UNICODE_ASCII16 = 0x0001 IS_TEXT_UNICODE_REVERSE_ASCII16 = 0x0010 IS_TEXT_UNICODE_STATISTICS = 0x0002 IS_TEXT_UNICODE_REVERSE_STATISTICS = 0x0020 IS_TEXT_UNICODE_CONTROLS = 0x0004 IS_TEXT_UNICODE_REVERSE_CONTROLS = 0x0040 IS_TEXT_UNICODE_SIGNATURE = 0x0008 IS_TEXT_UNICODE_REVERSE_SIGNATURE = 0x0080 IS_TEXT_UNICODE_ILLEGAL_CHARS = 0x0100 IS_TEXT_UNICODE_ODD_LENGTH = 0x0200 IS_TEXT_UNICODE_DBCS_LEADBYTE = 0x0400 IS_TEXT_UNICODE_NULL_BYTES = 0x1000 IS_TEXT_UNICODE_UNICODE_MASK = 0x000F IS_TEXT_UNICODE_REVERSE_MASK = 0x00F0 IS_TEXT_UNICODE_NOT_UNICODE_MASK = 0x0F00 IS_TEXT_UNICODE_NOT_ASCII_MASK = 0xF000 TCI_SRCCHARSET = 1 TCI_SRCCODEPAGE = 2 TCI_SRCFONTSIG = 3 TCI_SRCLOCALE = 0x100 API.new('GetTextCharset', 'L', 'I', 'gdi32') API.new('GetTextCharsetInfo', 'LPL', 'I', 'gdi32') API.new('IsDBCSLeadByte', 'P', 'B') API.new('IsDBCSLeadByteEx', 'IP', 'B') API.new('IsTextUnicode', 'PIP', 'B', 'advapi32') API.new('MultiByteToWideChar', 'ILPIPI', 'I') API.new('TranslateCharsetInfo', 'PPL', 'B', 'gdi32') API.new('WideCharToMultiByte', 'ILPIPIPP', 'I') # Convenient wrapper methods # Maps a wide character string to a new character string using the # specified +encoding+. If no encoding is specified, then CP_UTF8 # iss used if $KCODE is set to UTF8. Otherwise, CP_ACP is used. # # If the function fails it simply returns the string as-is. # def multi_to_wide(string, encoding=nil) unless encoding encoding = ($KCODE == 'UTF8') ? CP_UTF8 : CP_ACP end buf = ' ' * strlen(string) * 2 int = MultiByteToWideChar( encoding, 0, string, strlen(string), buf, strlen(buf) ) if int > 0 dest = ' ' * int * 2 wcsncpy(dest, buf, int) dest else string end end # Maps a wide character string to a new character string using the # specified +encoding+. If no encoding is specified, then CP_UTF8 # iss used if $KCODE is set to UTF8. Otherwise, CP_ACP is used. # # If the function fails it simply returns the string as-is. # def wide_to_multi(string, encoding=nil) unless encoding encoding = ($KCODE == 'UTF8') ? CP_UTF8 : CP_ACP end buf = ' ' * wcslen(string) int = WideCharToMultiByte( encoding, 0, string, wcslen(string), buf, strlen(buf), 0, 0 ) if int > 0 dest = ' ' * int strncpy(dest, buf, int) dest else string end end end end