Мне нужна помощь в преобразовании строки 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.