Как преобразовать строки UNICODE в MBCS в C #? - PullRequest
1 голос
/ 17 октября 2011

У меня есть строка UNICODE (китайский), которую я хочу преобразовать обратно в MBCS, чтобы добавить ее в качестве параметра в запрос SQL. (мне нужен столбец в SQL Server в varchar и так это преобразование).

Как я могу конвертировать в MBCS в c #? Пожалуйста помоги.

Спасибо, Празео

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

«MBCS» может быть числом кодировок.Для китайского языка это будет кодовая страница 936 , вариант GB, и вы можете кодировать его байты, используя:

byte[] bytes= Encoding.GetEncoding(936).GetBytes("你好")
=>
{196, 227, 186, 195}

Если вы не говорите конкретно о ГБкодирование и хотите, чтобы любая многобайтовая кодировка использовалась по умолчанию для вашей текущей системы, тогда вы можете просто использовать кодировку по умолчанию («ANSI»), которая будет такой кодировкой MBCS:

byte[] bytes= Encoding.Default.GetBytes("你好")
=>
{196, 227, 186, 195}  // on a system in the China locale (cp936)
{167, 65, 166, 110}   // on a system in the HK locale (cp950)

Теперь, чтобы получить свой байтовый массив взапрос, который вы должны выполнить:

1) лучший, используйте параметр с SqlDbType на основе байтов, например:

command.Parameters.AddWithValue("@greeting", bytes);

2), если вам нужно вставить его непосредственно вв строке запроса закодируйте байты в виде шестнадцатеричного литерала, например:

"0x"+BitConverter.ToString(bytes).Replace("-", "")
=>
... WHERE greeting=0xC4E3BAC3 ...

(это нестандартный синтаксис SQL Server по стандарту ANSI)

0 голосов
/ 22 октября 2011

Спасибо Бобинсу за подсказку.Я не мог параметризовать выполнение моего запроса.

Наконец, один из моих старших коллег помог.:) Вот еще одно решение для преобразования строки в кодировке Unicode в строку, состоящую из многобайтовых символов (MBCS), для сравнения в T-SQL со столбцами varchar в устаревшей базе данных.

Мы можем использовать метод GetNonUnicodeBytes () класса SqlString.

Ниже приведен фрагмент кода.

        string inputUnicodeString = "你好";
        SqlString mySqlString = new SqlString(inputUnicodeString);
        byte[] mbcsBytes = mySqlString.GetNonUnicodeBytes();
        string outputMbcsString = string.Empty;
        for (int index = 0; index < mbcsBytes.Length; index++)
        {
            outputMbcsString += Convert.ToChar(mbcsBytes[index]);
        }

Это помогло мне сравнить требуемый varcharстолбец базы данных с запрашиваемой пользователем строкой в ​​UNICODE.Надеюсь, этот ответ поможет другим.

С уважением,

Praseo

0 голосов
/ 17 октября 2011

Я не уверен, хотите ли вы этого:

string result = Encoding.GetEncoding("gb2312").GetString(Encoding.Unicode.GetBytes(yourStr));
...