Module: Windows::Unicode

Includes:
Error, MSVCRT::String
Included in:
File
Defined in:
lib/windows/unicode.rb

Constant Summary collapse

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

Constants included from Error

Error::ALLOWED_ABORT, Error::ALLOWED_FAIL, Error::ALLOWED_IGNORE, Error::ALLOWED_RETRY, Error::APPLICATION_ERROR_MASK, Error::CLASS_E_NOAGGREGATION, Error::CO_E_NOT_SUPPORTED, Error::DISP_E_BADINDEX, Error::DISP_E_EXCEPTION, Error::DISP_E_MEMBERNOTFOUND, Error::DISP_E_PARAMNOTFOUND, Error::ERRACT_ABORT, Error::ERRACT_DLYRET, Error::ERRACT_IGNORE, Error::ERRACT_INTRET, Error::ERRACT_PANIC, Error::ERRACT_RETRY, Error::ERRACT_USER, Error::ERRCLASS_ALREADY, Error::ERRCLASS_APPERR, Error::ERRCLASS_AUTH, Error::ERRCLASS_BADFMT, Error::ERRCLASS_CANT, Error::ERRCLASS_HRDFAIL, Error::ERRCLASS_INTRN, Error::ERRCLASS_LOCKED, Error::ERRCLASS_MEDIA, Error::ERRCLASS_NOTFND, Error::ERRCLASS_OUTRES, Error::ERRCLASS_SYSFAIL, Error::ERRCLASS_TEMPSIT, Error::ERRCLASS_TIME, Error::ERRCLASS_UNK, Error::ERRLOC_DISK, Error::ERRLOC_MEM, Error::ERRLOC_NET, Error::ERRLOC_SERDEV, Error::ERRLOC_UNK, Error::ERROR_ACCESS_DENIED, Error::ERROR_ALREADY_ASSIGNED, Error::ERROR_ALREADY_EXISTS, Error::ERROR_ARENA_TRASHED, Error::ERROR_AUTODATASEG_EXCEEDS_64k, Error::ERROR_BAD_ARGUMENTS, Error::ERROR_BAD_COMMAND, Error::ERROR_BAD_DRIVER_LEVEL, Error::ERROR_BAD_DYNALINK, Error::ERROR_BAD_ENVIRONMENT, Error::ERROR_BAD_EXE_FORMAT, Error::ERROR_BAD_FORMAT, Error::ERROR_BAD_LENGTH, Error::ERROR_BAD_PATHNAME, Error::ERROR_BAD_PIPE, Error::ERROR_BAD_THREADID_ADDR, Error::ERROR_BAD_UNIT, Error::ERROR_BROKEN_PIPE, Error::ERROR_BUSY_DRIVE, Error::ERROR_CALL_NOT_IMPLEMENTED, Error::ERROR_CANNOT_MAKE, Error::ERROR_CHILD_ALIVE_NOWAIT, Error::ERROR_CHILD_NOT_COMPLETE, Error::ERROR_CRC, Error::ERROR_CURRENT_DIRECTORY, Error::ERROR_DIRECT_ACCESS_HANDLE, Error::ERROR_DIR_NOT_EMPTY, Error::ERROR_DIR_NOT_ROOT, Error::ERROR_DISCARDED, Error::ERROR_DISK_CHANGE, Error::ERROR_DISK_FULL, Error::ERROR_DRIVE_LOCKED, Error::ERROR_DUP_FCB, Error::ERROR_DYNLINK_FROM_INVALID_RING, Error::ERROR_ENVVAR_NOT_FOUND, Error::ERROR_EXCL_SEM_ALREADY_OWNED, Error::ERROR_EXE_MARKED_INVALID, Error::ERROR_FAIL_I24, Error::ERROR_FCB_UNAVAILABLE, Error::ERROR_FILENAME_EXCED_RANGE, Error::ERROR_FILE_EXISTS, Error::ERROR_FILE_NOT_FOUND, Error::ERROR_GEN_FAILURE, Error::ERROR_HANDLE_DISK_FULL, Error::ERROR_HANDLE_EOF, Error::ERROR_I24_BAD_COMMAND, Error::ERROR_I24_BAD_LENGTH, Error::ERROR_I24_BAD_UNIT, Error::ERROR_I24_CHAR_CALL_INTERRUPTED, Error::ERROR_I24_CRC, Error::ERROR_I24_DISK_CHANGE, Error::ERROR_I24_GEN_FAILURE, Error::ERROR_I24_INVALID_PARAMETER, Error::ERROR_I24_NOT_DOS_DISK, Error::ERROR_I24_NOT_READY, Error::ERROR_I24_NO_MONITOR_SUPPORT, Error::ERROR_I24_OUT_OF_PAPER, Error::ERROR_I24_READ_FAULT, Error::ERROR_I24_SECTOR_NOT_FOUND, Error::ERROR_I24_SEEK, Error::ERROR_I24_UNCERTAIN_MEDIA, Error::ERROR_I24_WRITE_FAULT, Error::ERROR_I24_WRITE_PROTECT, Error::ERROR_I24_WRONG_DISK, Error::ERROR_INFLOOP_IN_RELOC_CHAIN, Error::ERROR_INFO_NOT_AVAIL, Error::ERROR_INSUFFICIENT_BUFFER, Error::ERROR_INTERRUPT, Error::ERROR_INVALID_ACCESS, Error::ERROR_INVALID_AT_INTERRUPT_TIME, Error::ERROR_INVALID_BLOCK, Error::ERROR_INVALID_CALLGATE, Error::ERROR_INVALID_CATEGORY, Error::ERROR_INVALID_DATA, Error::ERROR_INVALID_DRIVE, Error::ERROR_INVALID_EVENT_COUNT, Error::ERROR_INVALID_EXE_SIGNATURE, Error::ERROR_INVALID_FLAGS, Error::ERROR_INVALID_FLAG_NUMBER, Error::ERROR_INVALID_FUNCTION, Error::ERROR_INVALID_HANDLE, Error::ERROR_INVALID_LEVEL, Error::ERROR_INVALID_LIST_FORMAT, Error::ERROR_INVALID_MINALLOCSIZE, Error::ERROR_INVALID_MODULETYPE, Error::ERROR_INVALID_NAME, Error::ERROR_INVALID_ORDINAL, Error::ERROR_INVALID_PARAMETER, Error::ERROR_INVALID_PASSWORD, Error::ERROR_INVALID_SEGDPL, Error::ERROR_INVALID_SEGMENT_NUMBER, Error::ERROR_INVALID_SIGNAL_NUMBER, Error::ERROR_INVALID_STACKSEG, Error::ERROR_INVALID_STARTING_CODESEG, Error::ERROR_INVALID_TARGET_HANDLE, Error::ERROR_INVALID_VERIFY_SWITCH, Error::ERROR_IOPL_NOT_ENABLED, Error::ERROR_IO_INCOMPLETE, Error::ERROR_IO_PENDING, Error::ERROR_IS_JOINED, Error::ERROR_IS_JOIN_PATH, Error::ERROR_IS_JOIN_TARGET, Error::ERROR_IS_SUBSTED, Error::ERROR_IS_SUBST_PATH, Error::ERROR_IS_SUBST_TARGET, Error::ERROR_ITERATED_DATA_EXCEEDS_64k, Error::ERROR_JOIN_TO_JOIN, Error::ERROR_JOIN_TO_SUBST, Error::ERROR_LABEL_TOO_LONG, Error::ERROR_LOCKED, Error::ERROR_LOCK_VIOLATION, Error::ERROR_MAX_THRDS_REACHED, Error::ERROR_META_EXPANSION_TOO_LONG, Error::ERROR_MOD_NOT_FOUND, Error::ERROR_MONITORS_NOT_SUPPORTED, Error::ERROR_MORE_DATA, Error::ERROR_NEGATIVE_SEEK, Error::ERROR_NESTING_NOT_ALLOWED, Error::ERROR_NET_WRITE_FAULT, Error::ERROR_NOT_CURRENT_CTRY, Error::ERROR_NOT_DOS_DISK, Error::ERROR_NOT_ENOUGH_MEMORY, Error::ERROR_NOT_FROZEN, Error::ERROR_NOT_JOINED, Error::ERROR_NOT_LOCKED, Error::ERROR_NOT_READY, Error::ERROR_NOT_SAME_DEVICE, Error::ERROR_NOT_SUBSTED, Error::ERROR_NOT_SUPPORTED, Error::ERROR_NO_CHILD_PROCESS, Error::ERROR_NO_DATA, Error::ERROR_NO_ITEMS, Error::ERROR_NO_MORE_FILES, Error::ERROR_NO_MORE_SEARCH_HANDLES, Error::ERROR_NO_PROC_SLOTS, Error::ERROR_NO_SIGNAL_SENT, Error::ERROR_NO_UNICODE_TRANSLATION, Error::ERROR_NO_VOLUME_LABEL, Error::ERROR_OPEN_FAILED, Error::ERROR_OPERATION_ABORTED, Error::ERROR_OUT_OF_PAPER, Error::ERROR_OUT_OF_STRUCTURES, Error::ERROR_PATH_BUSY, Error::ERROR_PATH_NOT_FOUND, Error::ERROR_PIPE_BUSY, Error::ERROR_PIPE_CONNECTED, Error::ERROR_PIPE_LISTENING, Error::ERROR_PIPE_NOT_CONNECTED, Error::ERROR_PROC_NOT_FOUND, Error::ERROR_PROTECTION_VIOLATION, Error::ERROR_READ_FAULT, Error::ERROR_RELOC_CHAIN_XEEDS_SEGLIM, Error::ERROR_RING2SEG_MUST_BE_MOVABLE, Error::ERROR_RING2_STACK_IN_USE, Error::ERROR_SAME_DRIVE, Error::ERROR_SECTOR_NOT_FOUND, Error::ERROR_SEEK, Error::ERROR_SEEK_ON_DEVICE, Error::ERROR_SEM_IS_SET, Error::ERROR_SEM_NOT_FOUND, Error::ERROR_SEM_OWNER_DIED, Error::ERROR_SEM_TIMEOUT, Error::ERROR_SEM_USER_LIMIT, Error::ERROR_SEVERITY_ERROR, Error::ERROR_SEVERITY_INFORMATIONAL, Error::ERROR_SEVERITY_SUCCESS, Error::ERROR_SEVERITY_WARNING, Error::ERROR_SHARING_BUFFER_EXCEEDED, Error::ERROR_SHARING_VIOLATION, Error::ERROR_SIGNAL_PENDING, Error::ERROR_SIGNAL_REFUSED, Error::ERROR_SUBST_TO_JOIN, Error::ERROR_SUBST_TO_SUBST, Error::ERROR_SUCCESS, Error::ERROR_SYSTEM_TRACE, Error::ERROR_THREAD_1_INACTIVE, Error::ERROR_TOO_MANY_MODULES, Error::ERROR_TOO_MANY_MUXWAITERS, Error::ERROR_TOO_MANY_OPEN_FILES, Error::ERROR_TOO_MANY_SEMAPHORES, Error::ERROR_TOO_MANY_SEM_REQUESTS, Error::ERROR_TOO_MANY_TCBS, Error::ERROR_UNCERTAIN_MEDIA, Error::ERROR_USER_DEFINED_BASE, Error::ERROR_VIOKBD_REQUEST, Error::ERROR_WAIT_NO_CHILDREN, Error::ERROR_WRITE_FAULT, Error::ERROR_WRITE_PROTECT, Error::ERROR_WRONG_DISK, Error::ERR_TSTDUP, Error::ERR_TSTOVFL, Error::E_INVALIDARG, Error::E_NOINTERFACE, Error::E_NOTIMPL, Error::E_OUTOFMEMORY, Error::E_UNEXPECTED, Error::FORMAT_MESSAGE_ALLOCATE_BUFFER, Error::FORMAT_MESSAGE_ARGUMENT_ARRAY, Error::FORMAT_MESSAGE_FROM_HMODULE, Error::FORMAT_MESSAGE_FROM_STRING, Error::FORMAT_MESSAGE_FROM_SYSTEM, Error::FORMAT_MESSAGE_IGNORE_INSERTS, Error::FORMAT_MESSAGE_MAX_WIDTH_MASK, Error::I24_AREA, Error::I24_CLASS, Error::I24_OPERATION, Error::NO_ERROR, Error::REGDB_E_CLASSNOTREG, Error::RPC_E_TIMEOUT, Error::SCHED_E_ACCOUNT_DBASE_CORRUPT, Error::SCHED_E_ACCOUNT_INFORMATION_NOT_SET, Error::SCHED_E_ACCOUNT_NAME_NOT_FOUND, Error::SCHED_E_CANNOT_OPEN_TASK, Error::SCHED_E_INVALID_TASK, Error::SCHED_E_NO_SECURITY_SERVICES, Error::SCHED_E_SERVICE_NOT_INSTALLED, Error::SCHED_E_TASK_NOT_READY, Error::SCHED_E_TASK_NOT_RUNNING, Error::SCHED_E_TRIGGER_NOT_FOUND, Error::SCHED_E_UNKNOWN_OBJECT_VERSION, Error::SCHED_S_EVENT_TRIGGER, Error::SCHED_S_TASK_DISABLED, Error::SCHED_S_TASK_HAS_NOT_RUN, Error::SCHED_S_TASK_HAS_NO_MORE_RUNS, Error::SCHED_S_TASK_NOT_SCHEDULED, Error::SCHED_S_TASK_NO_VALID_TRIGGERS, Error::SCHED_S_TASK_READY, Error::SCHED_S_TASK_RUNNING, Error::SCHED_S_TASK_TERMINATED, Error::SEM_FAILCRITICALERRORS, Error::SEM_NOALIGNMENTFAULTEXCEPT, Error::SEM_NOGPFAULTERRORBOX, Error::SEM_NOOPENFILEERRORBOX, Error::S_OK, Error::TC_GP_TRAP, Error::TC_HARDERR, Error::TC_NORMAL, Error::TC_SIGNAL, Error::WSAEACCESS, Error::WSAEADDRINUSE, Error::WSAEADDRNOTAVAIL, Error::WSAEAFNOSUPPORT, Error::WSAEALREADY, Error::WSAEBADF, Error::WSAECANCELLED, Error::WSAECONNABORTED, Error::WSAECONNREFUSED, Error::WSAECONNRESET, Error::WSAEDESTADDRREQ, Error::WSAEDISCON, Error::WSAEDQUOT, Error::WSAEFAULT, Error::WSAEHOSTDOWN, Error::WSAEHOSTUNREACH, Error::WSAEINPROGRESS, Error::WSAEINTR, Error::WSAEINVAL, Error::WSAEINVALIDPROCTABLE, Error::WSAEINVALIDPROVIDER, Error::WSAEISCONN, Error::WSAELOOP, Error::WSAEMFILE, Error::WSAEMSGSIZE, Error::WSAENAMETOOLONG, Error::WSAENETDOWN, Error::WSAENETRESET, Error::WSAENETUNREACH, Error::WSAENOBUFS, Error::WSAENOEMPTY, Error::WSAENOMORE, Error::WSAENOPROTOOPT, Error::WSAENOTCONN, Error::WSAENOTSOCK, Error::WSAEOPNOTSUPP, Error::WSAEPFNOSUPPORT, Error::WSAEPROCLIM, Error::WSAEPROTONOSUPPORT, Error::WSAEPROTOTYPE, Error::WSAEPROVIDERFAILEDINIT, Error::WSAEREFUSED, Error::WSAEREMOTE, Error::WSAESHUTDOWN, Error::WSAESOCKTNOSUPPORT, Error::WSAESTALE, Error::WSAETOOMANYREFS, Error::WSAEUSERS, Error::WSAEWOULDBLOCK, Error::WSAHOST_NOT_FOUND, Error::WSANOTINITIALISED, Error::WSANO_DATA, Error::WSANO_RECOVERY, Error::WSASERVICE_NOT_FOUND, Error::WSASYSCALLFAILURE, Error::WSASYSNOTREADY, Error::WSATIMEDOUT, Error::WSATRY_AGAIN, Error::WSATYPE_NOT_FOUND, Error::WSAVERNOTSUPPORTED, Error::WSA_E_CANCELLED, Error::WSA_E_NO_MORE, Error::WSA_INVALID_HANDLE, Error::WSA_INVALID_PARAMETER, Error::WSA_IO_INCOMPLETE, Error::WSA_IO_PENDING, Error::WSA_NOT_ENOUGH_MEMORY, Error::WSA_OPERATION_ABORTED, Error::WSA_QOS_RECEIVERS, Error::WSA_QOS_SENDERS

Constants included from MSVCRT::String

MSVCRT::String::Mbscmp, MSVCRT::String::Mbscpy, MSVCRT::String::Mbslen, MSVCRT::String::Mbsrev, MSVCRT::String::Strchr, MSVCRT::String::Strcmp, MSVCRT::String::Strcpy, MSVCRT::String::Strcspn, MSVCRT::String::Strlen, MSVCRT::String::Strncpy, MSVCRT::String::Strpbrk, MSVCRT::String::Strrchr, MSVCRT::String::Strrev, MSVCRT::String::Strspn, MSVCRT::String::Strstr, MSVCRT::String::Strtok, MSVCRT::String::Wcscmp, MSVCRT::String::Wcscpy, MSVCRT::String::Wcslen, MSVCRT::String::Wcsncpy, MSVCRT::String::Wcsrev

Instance Method Summary collapse

Methods included from Error

#FAILED, #HRESULT_CODE, #HRESULT_FACILITY, #HRESULT_FROM_NT, #HRESULT_FROM_WIN32, #HRESULT_SEVERITY, #IS_ERROR, #MAKE_HRESULT, #MAKE_SCODE, #SUCCEEDED, #get_last_error

Methods included from MSVCRT::String

#mbscmp, #mbscpy, #mbslen, #mbsrev, #strchr, #strcmp, #strcpy, #strcspn, #strlen, #strncpy, #strpbrk, #strrchr, #strrev, #strspn, #strstr, #strtok, #strtok_s, #wcscmp, #wcscpy, #wcslen, #wcsncpy, #wcsrev

Instance Method Details

#multi_to_wide(string, encoding = nil) ⇒ Object

Maps a wide character string to a new character string using the specified encoding. If no encoding is specified, then CP_UTF8 is used if $KCODE (or the encoding name in Ruby 1.9.x) is set to UTF8. Otherwise, CP_ACP is used.

If the function fails it simply returns the string as-is.

Raises:

  • (TypeError)


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/windows/unicode.rb', line 94

def multi_to_wide(string, encoding=nil)
  return nil unless string
  raise TypeError unless string.is_a?(String)
  return string if IsTextUnicode(string, string.size, nil)
   
  unless encoding
    if RUBY_VERSION.to_f >= 1.9
      encoding = (string.encoding.name == 'UTF-8') ? CP_UTF8 : CP_ACP
    else
      encoding = ($KCODE == 'UTF8') ? CP_UTF8 : CP_ACP
    end
  end
   
  int = MultiByteToWideChar(encoding, 0, string, -1, nil, 0)
   
  # Trailing nulls are retained
  if int > 0
    buf = ' ' * int * 2
    MultiByteToWideChar(encoding, 0, string, -1, buf, int)
    buf
  else
    raise ArgumentError, get_last_error
  end         
end

#wide_to_multi(wstring, encoding = nil) ⇒ Object

Maps a wide character string to a new character string using the specified encoding. If no encoding is specified, then CP_UTF8 is used if $KCODE (or the encoding name in Ruby 1.9.x) is set to UTF8. Otherwise, CP_ACP is used.

If the function fails it simply returns the string as-is.

Raises:

  • (TypeError)


126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/windows/unicode.rb', line 126

def wide_to_multi(wstring, encoding=nil)
  return nil unless wstring
  raise TypeError unless wstring.is_a?(String)
   
  unless encoding
    if RUBY_VERSION.to_f >= 1.9
      encoding = (wstring.encoding.name == 'UTF-8') ? CP_UTF8 : CP_ACP
    else
      encoding = ($KCODE == 'UTF8') ? CP_UTF8 : CP_ACP
    end
  end

  # Add a trailing double null if necessary
  wstring << "\000\000" if wstring[-1].chr != "\000"

  int = WideCharToMultiByte(encoding, 0, wstring, -1, 0, 0, nil, nil)
   
  # Trailing nulls are stripped
  if int > 0
    buf = ' ' * int
    WideCharToMultiByte(encoding, 0, wstring, -1, buf, strlen(buf), nil, nil)
    buf[ /^[^\0]*/ ]
  else
    raise ArgumentError, get_last_error
  end         
end