【问题标题】:How to convert a string into it's real binary representation (UTF-8 or whatever is currently used)?如何将字符串转换为真正的二进制表示形式(UTF-8 或当前使用的任何形式)?
【发布时间】:2019-05-02 15:28:20
【问题描述】:

我想尝试 UTF-8 和 Unicode,为此我想建立一个小型网站,帮助我更好地理解编码。

首先我希望能够输入一些文本,然后获取字符串的实际二进制编码。为此,我正在从 C# 或 Java 中寻找与“.GetBytes”等价的东西。我不想要已解析的 CharCode!

这是一个我想在 JavaScript 中重现的 C# 函数

string ToBinary(string input)
{
    //this is the part I am looking for in JavaScript
    var utf8Bytes = Encoding.UTF8.GetBytes(input);

    var bytesFormatedToBin = utf8Bytes.Select(b => Convert.ToString(b, 2).PadLeft(8, '0'));
    return string.Join(' ', bytesFormatedToBin);
}

这里有一些示例结果:

  • "abc" => "01100001 01100010 01100011"
  • "@©®" => "01000000 11000010 10101001 11000010 10101110"
  • “?????????” => "11110000 10011111 10011000 10000000 11110000 10011111 10011000 10000100"

有没有办法在 JavaScript 中实现这一点?

谢谢。 马克

编辑:修复了截断的样本结果。

【问题讨论】:

  • "abc".split('').map(i => i.charCodeAt(0).toString(2).padStart(8, '0')).join(' '); 这样的东西,如果我没有遗漏什么,你只需要注意前导零。不过,表情符号可能需要进一步改进。
  • 如果你评估 "®".charCodeAt(0);你会得到 174。174 是这个字符的 Unicode 编号,但如果 UTF-8 编码,它不是内存中的实际值。在 UTF-8 中,这个 Char 占用两个字节“11000010”和“10101110”。这就是我想要得到的。

标签: javascript c# node.js utf-8 binary


【解决方案1】:

String.prototype.charCodeAt(...) 仅在字符串仅包含 ASCII 字符时才能正常工作。如果要处理其他字符,则必须使用标准 TextEncoder

const te = new TextEncoder('utf-8')
function toBinaryRepr(str) {
    return Array.from(te.encode(str))
        .map(i => i
            .toString(2)
            .padStart(8, '0'))
        .join(' ')
}
// '01100001 01100010 01100011'
toBinaryRepr('abc')
// '01000000 11000010 10101001 11000010 10101110'
toBinaryRepr('@©®')
// '11110000 10011111 10011000 10000000 11110000 10011111 10011000 10000100'
toBinaryRepr('??')

警告:TextEncoder 在旧版本的 Node.js 中不是全局构造函数 - 如果您收到一些错误提示 TextEncoder 未定义,请尝试通过以下方式导入:

const { TextEncoder } = require('util')

【讨论】:

  • 谢谢,TextEncoder 正是我想要的 :-)
  • 警告是一个很好的信息。我已经对关键字“TextEncoder”很满意,我找到了 API 文档,现在我面前打开了一扇通往新世界的大门 ;-)
猜你喜欢
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多