Module: Win32::Certstore::Mixin::String

Included in:
FFI::Pointer, Win32::Certstore, StoreBase
Defined in:
lib/win32/certstore/mixin/string.rb

Instance Method Summary collapse

Instance Method Details

#utf8_to_wide(ustring) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/win32/certstore/mixin/string.rb', line 30

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 += "\000\000" if ustring.length == 0 || ustring[-1].chr != "\000"

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

#wide_to_utf8(wstring) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/win32/certstore/mixin/string.rb', line 48

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 = if wstring.respond_to?(:encode)
              wstring.encode("UTF-8")
            else
              require "iconv"
              Iconv.conv("UTF-8", "UTF-16LE", wstring)
            end
  # remove trailing CRLF and NULL characters
  wstring.strip!
  wstring
end

#wstring(str) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/win32/certstore/mixin/string.rb', line 22

def wstring(str)
  if str.nil? || str.encoding == Encoding::UTF_16LE
    str
  else
    utf8_to_wide(str)
  end
end