OpenFileDialog имя файла как UTF8 - PullRequest
1 голос
/ 19 июня 2009

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. Должен ли я открыть этот новый вопрос в новом сообщении?

Ответы [ 5 ]

2 голосов
/ 20 июня 2009

0x201a - это символ Unicode «нижняя одиночная кавычка». 0x82 - это кодировка этого символа латинской 1 (ISO-8859-1, кодовая страница Windows 1252). Это означает, что байты имени файла интерпретируются как обычный Ansi, а не как UTF-8, и, таким образом, соответственно декодируются из Ansi в Unicode. Это неудивительно, поскольку файловая система не имеет понятия UTF-8, а Windows предполагает, что имена файлов не в Юникоде используют кодировку Ansi по умолчанию операционной системы.

Чтобы сделать то, что вы ищете, вам нужен доступ к оригинальным байтам в кодировке UTF-8, чтобы вы могли правильно их декодировать. Одна вещь, которую вы можете попробовать, это передать FileName методу GetBytes () System.Text.Encoding.Default (теоретически, он использует ту же кодировку, которая использовалась для декодирования имени файла, поэтому он должен иметь возможность создавать те же байты, что и исходный), а затем передают полученные байты в метод GetString () System.Text.Encoding.UTF8.

1 голос
/ 19 июня 2009

В ответ на ваш вопрос "есть ли способ трактовать имена файлов как utf-8?" Попробуйте этот код:

    List<byte[]> utf8FileNames = new List<byte[]>();
    foreach (string fileName in openFileDialog1.FileNames)
    {
        utf8FileNames.Add(Encoding.UTF8.GetBytes(fileName));
    }
    // Each byte array in utf8FileNames is a sequence of utf-8 bytes matching each file name chosen

Что вы делаете с именами файлов, когда получаете их из диалога открытия файла? Вы можете опубликовать этот код?

1 голос
/ 19 июня 2009

Можно ли использовать члены пространства имен System.Text (например, класс UTF8Encoding) для преобразования внутреннего строкового представления .NET Framework в / из байтового массива, содержащего текст в выбранной кодировке?

1 голос
/ 19 июня 2009

Если вы уверены, что вывод C ++ в порядке, то в своем приложении C # вы должны преобразовать его из UTF-8 в UTF-16, используя класс кодирования .NET , и просто работать с ним в Родной формат Windows.

Если вы можете изменить приложение C ++, это может быть лучше - укажите входные данные приложения C #, которые не нужно перекодировать. В нем преобразование UTF8 в Unicode может быть обработано через MultiByteToWideChar , используя CP_UTF8 для параметра CodePage, но это работает, только когда ни один из флагов не установлен для dwFlags (укажите 0 для dwFlags). Все приложение не должно быть Unicode. Даже если это не скомпилированный Unicode, вы можете выборочно использовать API Unicode.

1 голос
/ 19 июня 2009

Я думаю, что ваша проблема в начале:

У меня есть строка UTF-8, интерпретируется не-Unicode-программой в C ++. Этот текст, который отображается неправильно, но, насколько я могу судить, не поврежден, затем применяется как имя выходного файла ..

Если вы загрузите строку UTF-8 с помощью программы, не поддерживающей Юникод, а затем сериализуете ее, она будет содержать символы, отличные от Юникода.

Есть ли способ, с помощью которого ваша программа на C ++ может обрабатывать Unicode?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...