HarmonyOS鸿蒙Next中怎么获取txt文件中文字的编码格式

HarmonyOS鸿蒙Next中怎么获取txt文件中文字的编码格式 用arkts,我想获取本地的txt文件,在保存到自己软件的目录下,打开这个txt文件然后自动解码显示。

目前有几个问题

  1. 获取到本地的txt的uri:datashare:///media/file/2118 这种,然后用mediaLibrary获取到了文件名。

然后想用@ohos.file.fs中的fs.copyFile函数把这个文件复制到自己软件中的一个文件夹内,现在用这个函数报错13900002没有这个文件或目录。

  1. 读取文件的函数返回的是ArrayBuffer的类型,目前我用txt文件的小说试了一下发现全是乱码,有什么办法可以识别出txt文件的编码格式吗

更多关于HarmonyOS鸿蒙Next中怎么获取txt文件中文字的编码格式的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

我也写过一个小说app,因为网上下载的编码未知。

我是通过读取文件前200个字符,然后用不同的编码解码,再用正则匹配一下汉字个数,不是乱码当然能匹配很多汉字和英文了,可以做到简单的判断编码。

let reg = /[\u4E00-\u9FA5]/g // 汉字正则表达式
if (reg.test(bookMsg)){ // 测试匹配到汉字
    let num = bookMsg.match(reg);
    if (num.length > 100){ // 检测到汉字大于一定阈值,认为编码正确
        return true
    }
}
return false

如果有更好的办法分享下,谢谢

更多关于HarmonyOS鸿蒙Next中怎么获取txt文件中文字的编码格式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我最近找到了一个第三方库,

https://ohpm.openharmony.cn/#/cn/detail/

@ohos%2Fjuniversalchardet

可以识别出字符编码。用了一下发现很好用,

问题1

【1】权限要用READ_ONLY

fs.open(uri, fs.OpenMode.READ_ONLY)

【2】要添加权限WRITE_MEDIA

"name": "ohos.permission.WRITE_MEDIA"

问题2

不知道,是我的话,肯定是交给服务端处理。╮(╯▽╰)╭

我申请了权限,然后自己写了一个拷贝文件的,就是读取完后在写入另一个文件。但是这个官方的copyFile函数还不清楚应该怎么用,我按照文档提供的示例来弄的。是否还需要别的操作。

let srcPath = pathDir + "/srcDir/test.txt";
let dstPath = pathDir + "/dstDir/test.txt";
fs.copyFile(srcPath, dstPath).then(() => {
    console.info("copy file succeed");
}).catch((err) => {
    console.error("copy file failed with error message: " + err.message + ", error code: " + err.code);
});

我这边是一个需求,把本地的图片读出来地址,是沙箱地址,然后需要根据沙箱地址读到内存中,最后将内存中的文件id与目标路径用copyfile写入。

const file = await fs.open(uri, fs.OpenMode.READ_ONLY)
await fs.copyFile(file.fd, pathDir +"/dstDir/test时间戳.jpg") //注意这里要用随即数或时间戳,如果是一个固定的文件地址,那么首次能成功,之后就会拷贝失败。

谢谢,我等会尝试一下。

在HarmonyOS鸿蒙Next中,获取txt文件的编码格式可以通过以下步骤实现:

  1. 读取文件内容:使用File类读取txt文件的二进制数据。
  2. 检测编码:使用CharsetDetector类(来自icu4j库)检测文件的编码格式。CharsetDetector可以分析字节流并推测出最可能的编码。

示例代码:

import com.ibm.icu.text.CharsetDetector;
import ohos.global.resource.RawFileEntry;
import ohos.global.resource.ResourceManager;

public String detectEncoding(ResourceManager resourceManager, String filePath) {
    try {
        RawFileEntry rawFileEntry = resourceManager.getRawFileEntry(filePath);
        byte[] fileData = rawFileEntry.readBytes();
        CharsetDetector detector = new CharsetDetector();
        detector.setText(fileData);
        return detector.detect().getName();
    } catch (Exception e) {
        e.printStackTrace();
        return "Unknown";
    }
}

此方法返回检测到的编码格式,如UTF-8GBK等。

回到顶部