MultiByteToWideChar (kernel32)
Last changed: -85.39.214.154

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
static extern int MultiByteToWideChar(uint CodePage, uint dwFlags, string
   lpMultiByteStr, int cbMultiByte, [Out, MarshalAs(UnmanagedType.LPWStr)]
   StringBuilder lpWideCharStr, int cchWideChar);

Alternative version

    [DllImport("kernel32.dll")]
    private static extern int MultiByteToWideChar(
      uint CodePage,
      uint dwFlags,
      [MarshalAs(UnmanagedType.LPArray)] Byte[] lpMultiByteStr,
      int cbMultiByte,
      [Out, MarshalAs(UnmanagedType.LPArray)]
      Byte[] lpWideCharStr,
      int cchWideChar);

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

  public class Multibyte {
    [DllImport("kernel32.dll")]
    private static extern int MultiByteToWideChar(
      uint CodePage,
      uint dwFlags,
      //string lpMultiByteStr, //
      [MarshalAs(UnmanagedType.LPArray)] Byte[] lpMultiByteStr,
      int cbMultiByte,
      [Out, MarshalAs(UnmanagedType.LPArray)]
      Byte[] lpWideCharStr,
      int cchWideChar);

    public static string ToUnicode(uint codepage, Byte[] lpMultiByteStr) {
      Byte[] lpWideCharStr = new Byte[2*lpMultiByteStr.Length];
      MultiByteToWideChar(codepage, 0, lpMultiByteStr, lpMultiByteStr.Length, lpWideCharStr, 2*lpMultiByteStr.Length);
      return System.Text.Encoding.Unicode.GetString(lpWideCharStr);
    }

    [SqlFunction]
    public static SqlString ConvToUnicode(SqlInt32 codepage, SqlString multibyteString) {
      byte[] b = (byte[])ConvToMultibyteArray(multibyteString);
      return (SqlString)ToUnicode((uint)(int)codepage, b);
    }

    [SqlFunction]
    public static SqlBinary ConvToMultibyteArray(SqlString multibyteString) {
      byte[] result;
      Char[] ch = ((string)multibyteString).ToCharArray();
      if ((ch.Length > 4) && (ch[1] == (char)0x00) && (ch[3] == (char)0x00)) {
    result = new byte[ch.Length / 2];
    for (int i = 0; i < ch.Length / 2; i++) {
      result[i] = (byte)ch[i * 2];
    }
      }
      else {
    result = new byte[ch.Length];
    for (int i = 0; i < ch.Length; i++) {
      result[i] = (byte)ch[i];
    }
      }
      return (SqlBinary)result;
    }
  }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation