You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNOME扩展开发:在GJS中将字符串转为UTF-16字节数组

嘿,我刚好在GNOME扩展开发中处理过类似的编码转换问题,给你个靠谱的解决方案——优先用GLib原生绑定来处理,绝对比自己手动写JS编码逻辑稳得多。

首先得明确:GJS里的JavaScript字符串底层其实是GLib的UTF-8编码字符串,而你需要的是UTF-16格式的GLib.ByteArray来传给GLib.convert。这里直接用GLib提供的编码转换函数就搞定了,不用自己折腾字节操作。

具体步骤和代码示例

  • 第一步,用GLib.utf8_to_utf16()把你的JS字符串(UTF-8)转成UTF-16的数组,这里要注意指定字节序(LE或BE,根据你的需求选,一般系统默认是小端序)。
  • 第二步,把得到的Uint16Array转成Uint8Array,因为GLib.ByteArray是基于字节的。
  • 第三步,用GLib.ByteArray.new_from_bytes()创建符合要求的ByteArray对象,这样就能直接传给GLib.convert了。

代码如下:

// 你的输入字符串
const inputString = "你好,GNOME Extensions!";

// 转换为UTF-16小端序的Uint16Array
const utf16LEArray = GLib.utf8_to_utf16(inputString, -1, GLib.ByteOrder.LITTLE_ENDIAN);

// 转成Uint8Array(字节数组)
const byteBuffer = new Uint8Array(utf16LEArray.buffer);

// 创建GLib.ByteArray实例
const utf16ByteArray = GLib.ByteArray.new_from_bytes(GLib.Bytes.new(byteBuffer));

// 现在可以传给GLib.convert了,比如转成GBK编码(示例)
const convertedResult = GLib.convert(utf16ByteArray, "GBK", "UTF-16LE");

为什么推荐用GLib绑定?

  • 避免自己处理编码细节:GLib的编码函数已经处理了所有边缘情况,比如Unicode代理对、特殊字符,手动写JS很容易踩坑。
  • 符合GNOME生态:和系统的编码逻辑保持一致,不会出现奇怪的兼容性问题。
  • 支持字节序控制:直接通过GLib.ByteOrder指定LE/BE,比自己手动翻转字节方便多了。

如果实在想尝试JS原生的方法,可以用TextEncoder并指定"utf-16"编码,但还是优先用GLib的方法更稳妥。

内容的提问来源于stack exchange,提问作者abergmeier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:07:28