Как WChar относится к Unicode и ASCII - PullRequest
3 голосов
/ 25 июля 2011

Я собираюсь показать свое полное незнание того, как работает кодирование и различные строковые форматы.

Я передаю строку компилятору (Microsoft, как это происходит и для их Flight Simulator).Строка передается как часть XML-документа, который используется в качестве источника для компилятора.Это создается с использованием стандартных строк NET.Мне не нужно было специально указывать какую-либо кодировку или настройку типа, поскольку XML - это просто текст.

Строка - это просто набор символов.Это пример того, который дает ошибку:

ARG, AFL, AMX, ACA, DAH, CCA, AEL, AGN, MAU, SEY, TSC, AZA, AAL, ANA, BBC, CPA, CAL, COA, CUB, DAL, UGX, ELY, ОАЭ, ERT, ETH, EEZ, GHA, IRA, JAL, NWA, KAL, KAC, LAN, LDI, MAS, MEA, PIA, QTR, RAM, RJA, SVA, SIA, SWR, ROT, THA, THY, AUI, UAL, США, ACA, TAR, UZB, IYE, QFA

Если я создаю строку с помощью моей управляемой программы на C #, проблем не возникает.Однако эта строка взята из программы на С ++, которая может создать скомпилированный файл, используя свой собственный компилятор, который не совместим с MS one

Компилятору MS не нравится строка.Выдает две ошибки:

ОШИБКА ВНУТРЕННЕГО КОМПИЛЕРА: # C2621: Не удалось преобразовать строку WChar!ОШИБКА ВНУТРЕННЕГО КОМПИЛЕРА: # C2029: Не удалось преобразовать значение атрибута из UNICODE!

К сожалению, нет никакой полезной документации с компилятором об его ошибках.Мы просто делаем лучшее из того, что видим!

Я видел другие ошибки этого типа, но они содержат скрытые символы и управляющие символы, которые я могу поймать и удалить.

В этом случае я посмотрел наСтрока как Char [] и не могла видеть ничего необычного.Только то, что я ожидал.Нет значений выше предела ascii 127 и никаких управляющих символов.

Я понимаю, что WChar - это то, что C ++ понимает (но я не понимаю), Unicode - это двухбайтовое представление символов, а ASCII - однобайтовый.представление.

Я хотел бы сделать две вещи: сначала идентифицировать строку, которая потерпит неудачу, если передается компилятору, и затем исправить строку.Я предполагаю, что компилятор ожидает ASCII.

EDIT

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

public static string Bytes2String(byte[] bytes, int start, int length) {
            string temp = Encoding.Defaut.GetString(bytes, start, length);

        }

Я понял, что по умолчанию может возникнуть проблема, но его изменение на ASCII не имеет значения.Я начинаю верить, что сообщение об ошибке не то, чем кажется.

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Похоже, вы берете байтовый массив и конвертируете его как строку, используя кодировку, возвращаемую Encoding.Default.

Рекомендуется не делать этого ( в документации Microsoft ).

Вам необходимо выяснить, какая кодировка используется в программе C ++ для генерации байтового массива, и использовать эту же (или совместимую) для преобразования байтового массива обратно в строку снова в коде C #. Например. если байтовый массив использует кодировку ASCII, вы можете использовать:

System.Text.ASCIIEncoding.GetString(bytes, start, length);

или

System.Text.UTF8Encoding.GetString(bytes, start, length);

P.S. Я надеюсь Джоэл не поймает тебя ;)

0 голосов
/ 25 июля 2011

Мне нужно прийти , чтобы ошибка компилятора не имела отношения к формату кодировки строки.Оказывается, виновата длина строки.В соответствии с примером есть несколько записей, разделенных запятыми.Компилятор выдает довольно вредные сообщения, если количество записей превышает 50.

Однако, спасибо всем за вашу помощь - это подняло вопрос кодирования в моей памяти, и теперь я буду смотреть на это гораздо более внимательно

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