ReadTextAsync в приложении Магазина Windows с многобайтовым файлом и JavaScript

Я хотел бы прочитать файл CSV в моем приложении для магазина Windows, написанном на javascript. Если я использую readTextAsync, я получаю сообщение об ошибке при использовании некоторых немецких умлаутов.

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

Я нашел решение на С# здесь, ReadText из файла в кодировке ANSII, но у меня есть не знаю, как решить это в JavaScript?

Есть ли что-то вроде класса Encoding в JavaScript? Если я конвертирую файл в UTF8, он работает нормально, но мой клиент хотел бы использовать файл, сохраненный в Excel. Excel не использует UTF8 по умолчанию.


person 4Str4ngeG4me    schedule 31.01.2014    source источник


Ответы (1)


Самым простым было бы преобразовать файл в UTF-8, так как к нему легко получить доступ WinJS.

Точного эквивалента коду в библиотеке WinJS, которую вы нашли для C#, нет (по какой-то причине он не выставлен). Для UTF-8/16(L/H) доступны только простые кодировки.

Итак, если вы не хотите преобразовывать файл и используете JavaScript, я бы создал простой компонент среды выполнения Windows (пошаговое руководство), которое содержит требуемое поведение. Это довольно просто, если следовать пошаговому руководству. По сути, вы пишете какой-то код на C#, и когда вы делаете это в соответствии с правилами, он становится доступным в WinJS как компонент. Код, который вам нужно написать, также относительно прост:

public sealed class WinJSEncodingExtension
{
    public IAsyncOperation<string> ReadTextWithEncodingAsync(string appUri, 
             string encodingName) 
    {
        return ReadTextWithEncodingAsyncInternal(appUri, 
                                               encodingName).AsAsyncOperation();
    }

    private async Task<string> ReadTextWithEncodingAsyncInternal(string appUri, 
                    string encodingName)
    {
        StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(
                   new Uri(appUri, UriKind.Absolute));
        var buffer = await FileIO.ReadBufferAsync(file);
        byte [] rawBytes = new byte[buffer.Length];
        using (var reader = DataReader.FromBuffer(buffer))
        {
            reader.ReadBytes(rawBytes);
        }
        var encoding = Encoding.GetEncoding(encodingName);
        return encoding.GetString(rawBytes, 0, rawBytes.Length);            
    }
}

Поскольку класс Task недоступен в WinJS, он возвращает интерфейс IAsyncOperation<T>, который автоматически обертывается Promise в WinJS.

Я только немного протестировал его, но он должен помочь вам на вашем пути:

var ex = new EncoderComponent.WinJSEncodingExtension();
var ex = ex.readTextWithEncodingAsync("ms-appx:///test1.txt", "UTF-8")
         .then(function (result) {
    console.log(result);    
});

Допустимые кодировки указаны в таблице на эта страница.

person WiredPrairie    schedule 31.01.2014
comment
Спасибо, это работает. Затем я изменился на «выполнено после вызова», и аргументом моей функции является экземпляр StorageFile, а не URI. - person 4Str4ngeG4me; 01.02.2014