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;
}