开发过程中遇到有文档的编码类型不为utf-8,而ohos.file.fs中readTextSync,参数options-encoding仅支持utf-8,不支持其他编码类型,使用该方法打开文档会出现乱码。
下方代码中readGbkStr方法为解决方案。
使用openSync方法打开文件后,使用readSync方法读取数据到Uint8Array,最后使用TextDecoder用于将字节数组解码为字符串。
import type { common } from '@kit.AbilityKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { util } from '@kit.ArkTS';
// demo展示使用utf8\gbk编码打开gbk编码文档的页面
// writeGbkStr方法用于生成gbk编码文档用于展示
// readGbkStr方法为使用gbk编码打开文档的实现
@Entry
@Component
struct Index {
private ctx = this.getUIContext().getHostContext() as common.UIAbilityContext;
// 写入文档的内容,用于展示
private text = 'Text是文本组件,用于展示用户视图,如显示文章的文字内容。该组件支持绑定自定义文本选择菜单,用户可根据需要选择不同功能。';
// 用于测试生成的临时文件名
private fileName = 'test0.txt';
// 文件地址请按实际填写
private filesDir = this.ctx.filesDir + "/" + this.fileName;
aboutToAppear(): void {
writeGbkStr(this.filesDir, this.text);
}
build() {
Column() {
Text('read utf8:').fontWeight(600).fontSize(30).textAlign(TextAlign.Start).width("95%")
Text(fs.readTextSync(this.filesDir)).textAlign(TextAlign.Start).width("95%")
Text('read gbk:').fontWeight(600).fontSize(30).textAlign(TextAlign.Start).width("95%")
Text(readGbkStr(this.filesDir)).textAlign(TextAlign.Start).width("95%")
}
.height("100%")
.width("100%")
}
}
// 生成gbk编码的文档
function writeGbkStr(filesDir: string, content: string) {
let file = fs.openSync(filesDir, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
try {
let textEncoder = new util.TextEncoder('gbk');
let buffer = new ArrayBuffer(118);
let uint8 = new Uint8Array(buffer);
textEncoder.encodeIntoUint8Array(content, uint8);
fs.writeSync(file.fd, uint8.buffer);
} finally {
fs.close(file.fd);
}
}
function readGbkStr(filesDir: string) {
let file = fs.openSync(filesDir, fs.OpenMode.READ_ONLY);
try {
// 读取数据到Uint8Array
let buf = new ArrayBuffer(118);
fs.readSync(file.fd, buf);
let decoder = util.TextDecoder.create('gbk');
return decoder.decodeToString(new Uint8Array(buf));
} finally {
fs.close(file.fd);
}
}