C # вопрос здесь ..
У меня есть строка UTF-8, которая интерпретируется не-Unicode-программой на C ++. Этот текст, который отображается неправильно, но, насколько я могу судить, не поврежден, затем применяется в качестве выходного имени файла. .
В любом случае, в проекте на C # я пытаюсь открыть этот файл с помощью объекта System.Windows.Forms.OpenFileDialog . Имена файлов, которые я получаю из .FileNames [] этого объекта, в Unicode (UCS-2). Эта строка, однако, была неверно истолкована. Например, если исходная строка была 0xe3 0x81 0x82 , FileName []. ToCharArray () показывает, что теперь она 0x00e3 0x0081 0x201a .... .. Может показаться, что объект OpenFileDialog только дополняет его, но это не так. В третьем символе, который создал OpenFileDialog, он отличается, и я не могу понять, что случилось с этим байтом ..
У меня такой вопрос: есть ли способ трактовать имена файлов, выделенные в поле OpenFileDialog, как UTF-8?
Не думаю, что это актуально, но если вам нужно знать, строка написана на японском языке.
Спасибо
Креб
UPDATE
Прежде всего, спасибо всем, кто предложил свои предложения здесь, они очень ценятся.
Теперь, чтобы ответить на предложения по изменению приложения C ++ для правильной обработки строк, это не представляется возможным. Это не просто одно приложение, которое делает это со строками. На самом деле в моей компании есть множество таких приложений, с которыми мне приходится работать, и это заняло бы огромное количество рабочей силы и времени, которые просто не нужны. имеется в наличии. Тем не менее, идея Шона, вероятно, была бы лучшим выбором, если бы я выбрал этот маршрут.
@ Реми Лебо: Я думаю, что ударить ногтем прямо в голову, я попробую ваше предложенное решение и доложу ... :) Я предполагаю, что оговорка с вашим решением заключается в том, что кодировка Default должна быть такой же в прикладной среде C #, как и в прикладной среде C ++, создавшей файл, что, безусловно, имеет смысл, поскольку в нем должна использоваться та же кодовая страница
@ Джефф Джонсон: Я не вставляю имена файлов из приложения C ++ в приложение C #. Я звоню OpenFileDialog.ShowDialog () и получаю OpenFileDialog.FileNames на DialogResult.OK .. Я пытался использовать кодирование .UTF8.GetBytes (), но, как указал Реми Лебо, он не будет работать, потому что оригинальные байты UTF8 потеряны ..
@ всем остальным: спасибо за идеи ..:)
Креб
UPDATE
@ Реми Лебо: Ваша идея сработала отлично! Пока среда приложения C ++ такая же, как среда приложения C # одинакова (та же локаль для программ, не поддерживающих Юникод), я могу получить правильный текст .. :)
Теперь у меня больше проблем .. Хаха .. Есть ли способ определить кодировку строки? Теперь код работает для строк UTF8, которые были ошибочно интерпретированы как строки ANSI, но портят строки UCS-2. Мне нужно уметь определять кодировку и обрабатывать каждую соответственно. GetEncoding () не кажется полезным .. = / И также не является свойством StreamReader CurrentEncoding (всегда говорит UTF-8) ..
P.S. Должен ли я открыть этот новый вопрос в новом сообщении?