Мне нужна помощь в преобразовании строки C# из одной кодировки символов в другую?

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

сценарий: из приложения c# я хотел бы взять строковое значение из SQL db и использовать его в качестве имени каталога. У меня есть безопасный (SSL) FTP-сервер, на котором я хочу установить текущий каталог, используя строковое значение из БД.
: все работает нормально, пока я не нажму строковое значение с "специальный" символ-кажется, я не могу правильно кодировать имя каталога, чтобы удовлетворить FTP-сервер.

пример кода ниже

  • использует" специальный " символ é в качестве примера
  • использует WinSCP в качестве внешнего приложения для FTPS comms
  • не показывает весь код, необходимый для настройки процесса "_winscp".
  • отправляет команды в WinSCP exe, записывая в процесс standardinput
  • для простота, не получает информацию из БД, а вместо этого просто объявляет строку (но я сделал это.Равно для подтверждения того, что значение из БД совпадает с объявленной строкой)
  • делает три попытки установить текущий каталог на FTP-сервере, используя различные кодировки строк-все из которых терпят неудачу
  • делает попытку установить каталог, используя строку, которая была создана из массива байтов ручной работы-который работает

Process _winscp = new Process();
byte[] buffer;

string nameFromString = "Sinéad O'Connor";
_winscp.StandardInput.WriteLine("cd "" + nameFromString + """);

buffer = Encoding.UTF8.GetBytes(nameFromString);
_winscp.StandardInput.WriteLine("cd "" + Encoding.UTF8.GetString(buffer) + """);

buffer = Encoding.ASCII.GetBytes(nameFromString);
_winscp.StandardInput.WriteLine("cd "" + Encoding.ASCII.GetString(buffer) + """);

byte[] nameFromBytes = new byte[] { 83, 105, 110, 130, 97, 100, 32, 79, 39, 67, 111, 110, 110, 111, 114 };
_winscp.StandardInput.WriteLine("cd "" + Encoding.Default.GetString(nameFromBytes) + """);

в Кодировка UTF8 изменяет é на 101 (десятичный), но FTP-серверу это не нравится.

кодировка ASCII изменяет é на 63 (десятичный), но FTP-серверу это не нравится.

когда я представляю é как значение 130 (десятичное), FTP-сервер счастлив, за исключением того, что я не могу найти метод, который сделает это для меня (мне пришлось вручную создать строку из явных байтов).

кто-нибудь знает, что я должен сделать с моей строкой, чтобы кодировать é как 130 и сделать FTP-сервер счастливым и, наконец Поднимите меня до разработчика уровня 1, объяснив единственное, что разработчик должны понять?

2 ответов


130-это не ASCII (ASCII-это только 7 бит - см. кодировка.В ASCII документация -- так он бьет " é " в нормальный "?"потому что ему нечего делать). UTF-8 фактически кодирует символ в два байта (decimal: 195 & 169), но сохраняет кодовую точку.

использовать кодовую страницу явно, например латинский (CP 1252) -- должен соответствовать любой другой стороны. Как снизу, нет " 130 " на выходе так... не кодировка вам нужно :-) но то же самое относится: используйте кодировку для определенной кодовой страницы.

редактировать: как объяснил Ханс Пассант в комментарии, кодовая страница для использования здесь MS-DOS (CP 437) что приведет к желаемым результатам.

// LINQPad -- Encoding is System.Text.Encoding
var enc = Encoding.GetEncoding(1252);
string.Join(" ", enc.GetBytes("Sinéad O'Connor")).Dump();
// -> 83 105 110 233 97 100 32 79 39 67 111 110 110 111 114

см.:http://msdn.microsoft.com/en-us/goglobal/bb688114 Для больше.

удачи в кодировании.

кстати. хороший выбор в художниках - если это было намеренно: p


Я думаю, проблема здесь в том, что все строки .NET находятся в Unicode. В строках .NET нет "какой кодировки я". Итак, используя Encoding.ASCII.GetString(buffer) вы конвертируете свою "строку" в ASCII обратно в Unicode.

Я думаю, что ваша проблема должна быть решена путем изменения кодировки для процесс.StandardInput, поэтому вы получаете правильную кодировку внутри WinSCP.

или

вы должны проверить, что Encoding.Default есть, потому что я уверен, что это не UTF8 или ASCII.