Skip to content

Commit

Permalink
move unicode helper functions into Chef::Win32::API::Unicode
Browse files Browse the repository at this point in the history
  • Loading branch information
schisamo committed Dec 13, 2011
1 parent 6f01d5f commit ab3688d
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 47 deletions.
55 changes: 52 additions & 3 deletions chef/lib/chef/win32/api/unicode.rb
Expand Up @@ -22,9 +22,12 @@ class Chef
module Win32
module API
module Unicode

extend Chef::Win32::API

###############################################
# Win32 API Constants
###############################################

CP_ACP = 0
CP_OEMCP = 1
CP_MACCP = 2
Expand Down Expand Up @@ -85,8 +88,11 @@ module Unicode
TCI_SRCFONTSIG = 3
TCI_SRCLOCALE = 0x100

ffi_lib 'advapi32', 'kernel32'
ffi_convention :stdcall
###############################################
# Win32 API Bindings
###############################################

ffi_lib 'kernel32', 'advapi32'

=begin
BOOL IsTextUnicode(
Expand Down Expand Up @@ -123,6 +129,49 @@ module Unicode
=end
attach_function :WideCharToMultiByte, [:UINT, :DWORD, :LPCWSTR, :int, :LPSTR, :int, :LPCSTR, :LPBOOL], :int

###############################################
# Helpers
###############################################

def utf8_to_wide(ustring)
# ensure it is actually UTF-8
# Ruby likes to mark binary data as ASCII-8BIT
ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8"

# ensure we have the double-null termination Windows Wide likes
ustring = ustring << "\000\000" if ustring[-1].chr != "\000"

# encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode
ustring = begin
if ustring.respond_to?(:encode)
ustring.encode('UTF-16LE')
else
require 'iconv'
Iconv.conv("UTF-16LE", "UTF-8", ustring)
end
end
ustring
end

def wide_to_utf8(wstring)
# ensure it is actually UTF-16LE
# Ruby likes to mark binary data as ASCII-8BIT
wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding)

# encode it all as UTF-8
wstring = begin
if wstring.respond_to?(:encode)
wstring.encode('UTF-8')
else
require 'iconv'
Iconv.conv("UTF-8", "UTF-16LE", wstring)
end
end
# remove trailing CRLF and NULL characters
wstring.strip!
wstring
end

end
end
end
Expand Down
46 changes: 2 additions & 44 deletions chef/lib/chef/win32/unicode.rb
Expand Up @@ -22,50 +22,8 @@
class Chef
module Win32
class Unicode

class << self
include Chef::Win32::API::Unicode

def utf8_to_wide(ustring)
# ensure it is actually UTF-8
# Ruby likes to mark binary data as ASCII-8BIT
ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8"

# ensure we have the double-null termination Windows Wide likes
ustring = ustring << "\000\000" if ustring[-1].chr != "\000"

# encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode
ustring = begin
if ustring.respond_to?(:encode)
ustring.encode('UTF-16LE')
else
require 'iconv'
Iconv.conv("UTF-16LE", "UTF-8", ustring)
end
end
ustring
end

def wide_to_utf8(wstring)
# ensure it is actually UTF-16LE
# Ruby likes to mark binary data as ASCII-8BIT
wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding)

# encode it all as UTF-8
wstring = begin
if wstring.respond_to?(:encode)
wstring.encode('UTF-8')
else
require 'iconv'
Iconv.conv("UTF-8", "UTF-16LE", wstring)
end
end
# remove trailing CRLF and NULL characters
wstring.strip!
wstring
end
end

include Chef::Win32::API::Unicode
extend Chef::Win32::API::Unicode
end
end
end
Expand Down

0 comments on commit ab3688d

Please sign in to comment.