Nodejs 字符集转换问题请教 'а' === 'a' 输出 false
发布于 5 年前 作者 yanqi321 4033 次浏览 来自 问答

项目中遇到一个问题。用户通过文本编辑器输入的内容(包含不同字符集)。后端想要处理统一一下(utf8)。请问如何转换呢?

console.log('а' === 'a') // false
console.log('і' === 'i') // false

大家可以把上面的字符copy到电脑上试一下。 试了一下 通过 iconv-lite 库进行转换,输出的还是原字符

const iconv = require('iconv-lite')
let text = 'а'
console.log('text', text)
text = iconv.decode(Buffer.from(text), 'utf8')
console.log(text === 'a')

还有就是一段文本可能包含不同字符集。 是我的使用方式有问题吗?

谢谢大家,目前通过这个方式进行转换了,比较低级

function Cyrillic2latin (string) {
  var cyrillic = 'А_В_С_Е_Н_І_Ј_К_М_О_Р_Ѕ_Т_Х_Ү_а_с_е_һ_і_ј_к_м_о_р_ѕ_х_у'.split('_')
  var latin = 'A_B_C_E_H_I_J_K_M_O_P_S_T_X_Y_a_c_e_h_i_j_k_m_o_p_s_x_y'.split('_')

  return string.split('').map(function (char) {
    var index = cyrillic.indexOf(char)
    if (!~index) return char
    return latin[index]
  }).join('')
}
7 回复

貌似是一个特殊字符集里面订单a, 但是显示的时候显示成一样的了.

@junfan 嗯,好像第一个a 是gb2312 或者 cyrillic 字符。问题是如何转换呢?

@yanqi321 你们转换为了什么, 我感觉可以不转换, 如果非要转换的话, 你们只能做一个映射表, 它这个不是gb2312, 是unicode 1072

第一个看起来 ‘a’ 的编码是 <Buffer d0 b0>

@junfan , unicode包含多个字符集(97 是Basic Latin。 1072是cyrillic ) 我想做一个单词拼写检查。 词库里面 有 ‘and’ 这个词。 但是 cyrillic 的 and 被识别为拼写错误(nd 都是正常的latin字符)。所以想能不能转换一下

https://zh.wikipedia.org/wiki/西里尔字母

这个里面有cyrillic字母表, 感觉如果你们要这么做的话, 需要按照这个字母表里面和ascci的字母表重合的部分对你们的数据和搜索词都进行转换

回到顶部