我想在我的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。
答案 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页面的表格中。