Nodejs将字符串转换为UTF-8

Alo*_*ius 31 utf-8 node.js

从我的数据库我得到以下字符串:

Johan Öbert
Run Code Online (Sandbox Code Playgroud)

应该说的是:

Johan Öbert
Run Code Online (Sandbox Code Playgroud)

我试着把它转换成utf-8,就像这样:

nameString.toString("utf8");
Run Code Online (Sandbox Code Playgroud)

但还是同样的问题.

有任何想法吗?

Rei*_*ica 35

我建议使用Buffer该类:

var someEncodedString = Buffer.from('someString', 'utf-8').toString();
Run Code Online (Sandbox Code Playgroud)

这避免了其他答案所需的任何不必要的依赖项,因为Buffer包含在node.js, 并且已经在全局范围中定义。

  • 这不是从 utf-8 转换为 utf-8 吗? (5认同)
  • 在与答案中建议的 utf8 包进行斗争之后,只需使用您的代码行即可开箱即用。谢谢! (3认同)
  • 这对我有用:`Buffer.from(fileName, 'ascii').toString('utf-8')` (3认同)

Jay*_*ram 29

使用npm 的utf8模块对字符串进行编码/解码.

安装:

npm install utf8
Run Code Online (Sandbox Code Playgroud)

在浏览器中:

<script src="utf8.js"></script>
Run Code Online (Sandbox Code Playgroud)

在Node.js中:

const utf8 = require('utf8');
Run Code Online (Sandbox Code Playgroud)

API:

编码:

utf8.encode(string)
Run Code Online (Sandbox Code Playgroud)

将任何给定的JavaScript字符串(字符串)编码为UTF-8,并返回字符串的UTF-8编码版本.如果输入字符串包含非标量值(即单独的代理项),则会引发错误.(如果您还需要能够编码非标量值,请改用WTF-8.)

// U+00A9 COPYRIGHT SIGN; see http://codepoints.net/U+00A9
utf8.encode('\xA9');
// ? '\xC2\xA9'
// U+10001 LINEAR B SYLLABLE B038 E; see http://codepoints.net/U+10001
utf8.encode('\uD800\uDC01');
// ? '\xF0\x90\x80\x81'
Run Code Online (Sandbox Code Playgroud)

解码:

utf8.decode(byteString)
Run Code Online (Sandbox Code Playgroud)

将任何给定的UTF-8编码字符串(byteString)解码为UTF-8,并返回字符串的UTF-8解码版本.检测到格式错误的UTF-8时会抛出错误.(如果您还需要能够解码编码的非标量值,请改用WTF-8.)

utf8.decode('\xC2\xA9');
// ? '\xA9'

utf8.decode('\xF0\x90\x80\x81');
// ? '\uD800\uDC01'
// ? U+10001 LINEAR B SYLLABLE B038 E
Run Code Online (Sandbox Code Playgroud)

资源

  • 为什么不使用 [`Buffer.from`](https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_string_encoding) 和 [`StringDecoder`](https://nodejs.org/api/string_decoder.html)? (4认同)
  • 模块dident设法转换它,输出仍然是错误的 (2认同)

小智 14

我有同样的问题,当我加载文本文件时fs.readFile(),我试图将编码设置为UTF8,它保持相同.我现在的解决方案是:

myString = JSON.parse( JSON.stringify( myString ) )
Run Code Online (Sandbox Code Playgroud)

在此之后,Ö被真正地解释为Ö.

  • 这对我有用。其他的,没有。UTF8 模块因缺少字符串类型的某种扩展的错误而崩溃。iConv 模块不会安装,因为它想在安装过程中编译......愚蠢的东西。 (2认同)

paa*_*aat 6

当您想要更改编码时,您总是从一个到另一个.所以,你可能会去从Mac RomanUTF-8ASCIIUTF-8.

知道所需的输出编码与当前源编码一样重要.例如,如果你有Mac Roman和你解码它UTF-16,UTF-8你只会让它乱码.

如果您想了解有关编码的更多信息,本文将介绍很多细节:

每个程序员绝对需要了解编码和字符集以处理文本

使用node-iconviconv-lite的npm pacakge 编码应该允许您轻松指定所需的源和输出编码:

var resultBuffer = encoding.convert(nameString, 'ASCII', 'UTF-8');
Run Code Online (Sandbox Code Playgroud)