批处理之家's Archiver

CrLf 发表于 2015-9-27 14:03

Node.js 如何实现类似 GRAFTABL 的效果?

[i=s] 本帖最后由 CrLf 于 2015-9-27 16:47 编辑 [/i]

Node.js 输出到屏幕时,默认编码为 utf8,如何改为 unicode?大概类似 cmd 中 CHCP 437 之后再 GRAFTABL 936 的意思
试过下面这些方案,效果都不对,要么汉字上屏后显示为空,要么输出的仍是 utf8 字符串,感觉对 Node 的机制理解有误,求指导[code]console._stdout._readableState.defaultEncoding  = 'utf16le'
console.log('{测试}')[/code][code]process.stdout._readableState.defaultEncoding = process.stdin._readableState.defaultEncoding = 'utf16le'
process.stdout.write('{测试}')[/code][code]process.stdout.setEncoding('utf16le').write('{测试}')[/code][code]var iconv = require('iconv-lite'); //刚才忘了加 =_=

output('{测试}')

function output(chunk){
        var chunk = typeof chunk=='string' ? chunk : JSON.stringify(chunk)
        var str = (new Buffer(chunk,'utf8'))
        var buf = new Buffer(iconv.encode(str, 'gbk'),'bin')
        process.stdout.write(buf)
        return
}[/code]------------------------------------------------------
现在只能加上 iconv 转码来实现:[code]node xxx.js | iconv -f "utf-8" -t "gb2312"
node xxx.js | iconv -f "utf-8" -t "gb2312" | more[/code]怎样做到不需要 iconv 也能正常显示汉字?[code]node xxx.js
node xxx.js | more[/code]

CrLf 发表于 2015-9-27 15:23

[i=s] 本帖最后由 CrLf 于 2015-9-27 15:42 编辑 [/i]

简单说就是既能保证汉字正常上屏,而且以 node xxx.js >test.txt 运行时又能按 Unicode(utf16le) 编码输出到文件,当然,xxx.js 并不知道当前的输出是否被重定向了
要是能是 gbk 当然更好了...

aa77dd@163.com 发表于 2015-9-27 15:37

UTF-8 是 Unicode 的一种实现方式

CrLf 发表于 2015-9-27 15:40

[i=s] 本帖最后由 CrLf 于 2015-9-27 15:43 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=175148&ptid=37472]3#[/url] [i]aa77dd@163.com[/i] [/b]


    好吧,你是对的,我被记事本带坏了
    前文的 Unicode 确切说应该是 utf16le

yu2n 发表于 2015-9-27 16:03

个人理解是宿主程序的解析问题。

举个例子
*.cmd, *.bat 的宿主程序是cmd.exe,当简体系统下编写的 .bat 文件(ascii编码)放在繁体系统下面运行时,中文会乱码。
.vbs , .vbe  的宿主程序是 cscript.exe,当脚本编码为 ULE 时,简体、繁体系统 cmd 执行  cscript.exe 时,均不会乱码。

对 Node.js 不熟,猜想 Node.js 宿主程序不是 cmd.exe 吧,中文乱码因该不是 cmd.exe 的问题。
建议统一 .js 文件编码为 utf-8 试试。

CrLf 发表于 2015-9-27 16:08

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=175150&ptid=37472]5#[/url] [i]yu2n[/i] [/b]


    试了下还是没能解决,改变文本编码好像只影响脚本中自带的字符串,貌似与通过 get、post、命令行参数传递进来的汉字无关

yu2n 发表于 2015-9-27 16:17

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=175152&ptid=37472]6#[/url] [i]CrLf[/i] [/b]

我对PHP比较熟一点,一般是这样解决乱码问题:
1.  .php 文件统一使用使用无 BOM 的 UTF-8 编码。
2. 在输出的头一行加上[code]<?php header("Content-type: text/html; charset=utf-8"); ?>[/code]3. html 文件 head 标签 加上[code]<meta charset="utf-8" />[/code]4. 文件系统输出列表时,中文路径[code]// 中文化支持(输出中文文件路径时)
function utf8_cn($str) {
  //return iconv('GB2312', 'UTF-8', $str);
  return siconv($str, 'UTF-8', 'GB2312');
}

// 较安全的转码函数
function siconv($str, $out_charset, $in_charset) {
  if (strtoupper($out_charset) != strtoupper($in_charset)) {
    if (function_exists('iconv') && (@$outstr = iconv("$in_charset//IGNORE", "$out_charset//IGNORE", $str))) {
      return $outstr;
    } elseif (function_exists('mb_convert_encoding') && (@$outstr = mb_convert_encoding($str, $out_charset, $in_charset))) {
      return $outstr;
    }
  }
  return $str;
}[/code]

aa77dd@163.com 发表于 2015-9-27 16:25

iconv-lite 不知能否解决

[url]https://github.com/ashtuchkin/iconv-lite[/url]

CrLf 发表于 2015-9-27 16:45

[i=s] 本帖最后由 CrLf 于 2015-9-27 16:51 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=175154&ptid=37472]7#[/url] [i]yu2n[/i] [/b]


因为 php 需要 iis,所以不太适合我的用途
事实上,我是想构建一个简易的跨进程、跨脚本、跨平台的脚本通信方案,从便携性和功能等方面综合考量,几种方案的优先级应该是 nodejs>nc>php>共享文件。
此处上屏的文字和 html 无关,仅仅是把两端通信的结果打印出来而已,所以我想应该是不能用 html 的办法来解决的吧,而且经过各种测试,上屏后的编码和传递给 process.stdout 的编码格式似乎也无关,大概是另有一套机制
目前已经实现主体功能,唯独此处是鱼与熊掌,要么汉字不能直接上屏,要么就输出为 utf-8 导致客户端脚本无法识别,其实不是什么很重要的问题,不过我想能完善当然最好不过的了

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=175155&ptid=37472]8#[/url] [i]aa77dd@163.com[/i] [/b]


感谢关注,不过已经试过 iconv-lite,顶楼代码 4 就是...话说我复制过来时忘了保留 require

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.