从包含nodejs中的重音字符的文件中读取

时间:2013-05-31 18:49:21

标签: node.js utf-8 maxmind

所以我正在解析一个大的csv文件并将结果推送到mongo。

该文件为maxminds city database。它有各种有趣的utf8字符。我仍然在某些城市名​​称中得到(?)符号。以下是我阅读文件的方式:

(使用csv节点模块)

csv().from.stream(fs.createReadStream(path.join(__dirname, 'datafiles', 'cities.csv'), {
    flags: 'r',
    encoding: 'utf8'
})).on('record', function(row,index){
.. uninteresting code to add it to mongodb
});

我在这里做错了什么? 我在mongo:加拿大Ch teauguay获得这样的东西

修改

我尝试使用不同的lib来读取文件:

lazy(fs.createReadStream(path.join(__dirname, 'datafiles', 'cities.csv'), {
    flags: 'r',
    encoding: 'utf8',
    autoClose: true
  }))
    .lines
    .map(String)
    .skip(1) // skips the two lines that are iptables header
    .map(function (line) {
      console.log(line);
    });

它会产生同样糟糕的结果: 154252, “PA”, “03”, “Capellana”, “”,8.3000,-80.5500 ,, 154220,“AR”,“01”,“VillaEspa a”,“”, - 34.7667,-58.2000 ,,

1 个答案:

答案 0 :(得分:2)

结果maxmind在latin1中编码他们的东西。

这有效:

  var iconv  = require('iconv-lite')
  lazy(fs.createReadStream(path.join(__dirname, 'datafiles', 'cities.csv')))
    .lines
    .map(function(byteArray) {
      return iconv.decode(byteArray, 'latin1');
    })
    .skip(1) // skips the two lines that are iptables header
    .map(function (line) {
   //WORKS