目录

如何使用ohos.file.fs打开gbk编码文档

问题现象

开发过程中遇到有文档的编码类型不为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);
  }
}