Windows Store应用程序中的ReadTextAsync具有多字节文件和JavaScript

时间:2014-01-31 19:42:03

标签: javascript windows-8 windows-runtime

我想在我的javascript编写的Windows商店应用中阅读CSV文件。如果我使用readTextAsync,我在使用一些德国变音符号时会出错。

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

我在C#中找到了一个解决方案ReadText from file in ANSII encoding,但我不知道如何在JavaScript中解决它?

有没有像JavaScript中的Encoding类?如果我将文件转换为UTF8它工作正常,但我的客户想要使用excel保存的文件。 Excel默认情况下不使用UTF8。

1 个答案:

答案 0 :(得分:3)

最简单的方法是将文件转换为UTF-8,因为WinJS可以轻松访问该文件。

在C#中找到的WinJS库中没有完全相同的代码(出于某种原因,它没有公开)。 UTF-8/16(L / H)只有简单的编码。

因此,如果你不想转换文件而你正在使用JavaScript,我会创建一个包含你想要的行为的简单Windows运行时组件(walkthrough)。如果你按照演练这一点很简单。基本上,您在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>,该接口由WinJS中的Promise自动包装。

我只测试了一下,但它应该会帮助你:

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

有效编码位于this页面的表格中。