LINUX.ORG.RU

node.js - ASCII to UTF8

 ,


0

1

есть dgram сервер которому шлют сообщения в ASCII
кто нибудь знает как их перевести в нормальный UTF8, убрав эти управляющие символы?
чтоб работать уже нормально с этими строками, класть их в базу и так далее?

node-iconv и подобные не помогают, потому что

http://clip2net.com/s/5vA5UV
http://clip2net.com/s/5vA5vb

немного не понял, но может такой велосипед поможет:

var test = '\ns\nome\n-da\tt\0a';

var in_ = new Buffer(test, 'ASCII');
var out_ = [];
var ch = null;

for (var offset = 0; offset < in_.length; offset++)
{
        ch = in_.readUInt8(offset);
        if ((ch > 32) && (ch < 127))
        {
                out_.push(ch)
        }
}

console.log(test)
console.log((new Buffer(out_)).toString())

И перевод на новую строку убирается (как и все управляющие символы).

rikardoac
()
Ответ на: комментарий от rikardoac

неплохо работает на символах которые входят в us-ascii (что часть utf)
а вот с остальным даже страшно =)

главное что гугление не помогает, видел решения которые трудно понять, вроде строят свою таблицу символов, считают и переводят байты.
но это же жесть и опять таки, только для латиницы

system-root ★★★★★
() автор топика
Ответ на: комментарий от system-root

ну в принципе, идея самая логичная - собрать массив с разрешенными символами и отфильтровывать неподходящие. только вот реализовывать это я уже не буду ;-)

rikardoac
()
Ответ на: комментарий от system-root

откровенно говоря, я тоже думал, что все окажется легче и проще.

если есть желание можешь сбросить мне файл с тестовыми данными, может на днях поэксперементирую.

rikardoac
()
Ответ на: комментарий от rikardoac

я решил изучить node.js, да и сам js не по учебникам а создавая странные приложения.
это обычный dgram сервер который слушает udp4 53й порт, в который я отправляю запросы через dig

dig -p 9000 @192.168.0.200 test
var dgram = require("dgram");
var server = dgram.createSocket("udp4");

server.on("message", function (msg, rinfo) {
  console.log("received: " + msg + "  from " +
    rinfo.address + ":" + rinfo.port);
console.log("encode: \n" + msg.toString(0));
});
server.on("listening", function () {
  var address = server.address();
  console.log("server listening " +
      address.address + ":" + address.port);
});

server.bind(9000);

system-root ★★★★★
() автор топика
Ответ на: комментарий от rikardoac
var utfqname = function (qname) {

var qname = qname.toString(0);  
//здесь <= 32 и >= 127 && <= 152 - это управляющие символы ASCII
var chars = []; 
for (var i = 0; i < qname.length ; i++) {
    if (qname.charCodeAt(i) <= 32) { chars.push(".")} // заменяем что подошло на точку
      else if (qname.charCodeAt(i) >= 127 && qname.charCodeAt(i) <= 152) { chars.push(".")} // и на всякий случай, если адрес будет длинный
        else {   chars.push(String.fromCharCode(qname.charCodeAt(i))); }
var arr =  chars.join(''); 

 } // for
  return arr;
 }; // utfqname
system-root ★★★★★
() автор топика
Последнее исправление: system-root (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.