WinRT Нет сопоставления для символа Unicode на целевой многобайтовой кодовой странице

Я пытаюсь прочитать файл в своем приложении для Windows 8 Store. Вот фрагмент кода, который я использую для этого:

        if(file != null)
        {
            var stream = await file.OpenAsync(FileAccessMode.Read);
            var size = stream.Size;
            using(var inputStream = stream.GetInputStreamAt(0))
            {
                DataReader dataReader = new DataReader(inputStream);
                uint numbytes = await dataReader.LoadAsync((uint)size);
                string text = dataReader.ReadString(numbytes);
            }
        }

Однако вывод выполняется в строке:

string text = dataReader.ReadString(numbytes);

Сообщение об освобождении:

No mapping for the Unicode character exists in the target multi-byte code page.

Как мне это сделать?

Ответ 1

Мне удалось правильно прочитать файл, используя аналогичный подход, предложенный duDE:

        if(file != null)
        {
            IBuffer buffer = await FileIO.ReadBufferAsync(file);
            DataReader reader = DataReader.FromBuffer(buffer);
            byte[] fileContent = new byte[reader.UnconsumedBufferLength];
            reader.ReadBytes(fileContent);
            string text = Encoding.UTF8.GetString(fileContent, 0, fileContent.Length);
        }

Может кто-нибудь, пожалуйста, уточните, почему мой первоначальный подход не сработал?

Ответ 2

Попробуйте это вместо string text = dataReader.ReadString(numbytes):

dataReader.ReadBytes(stream);
string text = Convert.ToBase64String(stream);

Ответ 3

Если, как и я, это был лучший результат при поиске той же ошибки в отношении UWP, см. Ниже:

Код, который у меня был, выдавал ошибку (не существует сопоставления для символа Юникод..):

  var storageFile = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFileAsync(fileToken);
        using (var stream = await storageFile.OpenAsync(FileAccessMode.Read))
        {
            using (var dataReader = new DataReader(stream))
            {
                await dataReader.LoadAsync((uint)stream.Size);
                var json = dataReader.ReadString((uint)stream.Size);
                return JsonConvert.DeserializeObject<T>(json);
            }
        }

То, что я изменил, чтобы он работал правильно

     var storageFile = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFileAsync(fileToken);
        using (var stream = await storageFile.OpenAsync(FileAccessMode.Read))
        {
            T data = default(T);
            using (StreamReader astream = new StreamReader(stream.AsStreamForRead()))
            using (JsonTextReader reader = new JsonTextReader(astream))
            {
                JsonSerializer serializer = new JsonSerializer();
                data = (T)serializer.Deserialize(reader, typeof(T));
            }
            return data;
        }