在BitBar中调用CL脚本输出乱码,排查了一番暂时没什么头绪了😂

22 views
Skip to first unread message

Liutos

unread,
Jan 4, 2020, 3:39:25 AM1/4/20
to lis...@googlegroups.com
尝试用Common Lisp来编写BitBar的插件,结果在菜单栏输出的内容始终为一个问号,截图如下
image.png

总共有两个源文件:
1. cl-bitbar.ros。是用ros init来直接生成的,然后稍加修改;
2. cl-bitbar.lisp。负责调用 format 来输出内容。

cl-bitbar.ros 的内容如下
#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec /usr/local/bin/ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  ;;#+quicklisp(ql:quickload '() :silent t)
  (let ((sb-impl::*default-external-format* :UTF-8))
    (load "/Users/liutos/SourceCode/cl/cl-bitbar/cl-bitbar.lisp")))

(defpackage :ros.script.cl-bitbar.3787106705
  (:use :cl))
(in-package :ros.script.cl-bitbar.3787106705)

(defun main (&rest argv)
  (declare (ignorable argv))
  (let ((sb-impl::*default-external-format* :UTF-8))
    (com.liutos.cl-bitbar::main)))
;;; vim: set ft=lisp lisp:

cl-bitbar.lisp 的内容如下
(in-package #:cl-user)

(defpackage #:com.liutos.cl-bitbar
  (:use #:cl))

(in-package #:com.liutos.cl-bitbar)

(defun main ()
  (format t "生"))

这个.ros文件在命令行直接调用是没有问题的,截图如下
image.png

想请教各位一些问题:
1. 有人试过用CL写BitBar插件并遇到上述问题的吗?如果有并且解决了的话,恳求传授经验😂;
2. 或者有人对出现这类乱码问题有什么心得的吗?希望不吝赐教

我有试过在命令行重定向 cl-bitbar.ros 脚本的输出,确认了这个“生”字在输出的时候是 UTF-8 编码的,理应不会是展示为问号。我也试过修改 com.liutos.cl-bitbar::main,让它把“生”字写入到文件中,用 hexdump 查看的结果与重定向一致。

难道是在输出到标准输出的时候,编码就会被改了吗?🤔

--
Liutos Love Linux LaTeX Lisp Ling

我的GitHub主页:https://github.com/Liutos

Xiaofeng Yang

unread,
Jan 4, 2020, 10:08:32 AM1/4/20
to lisp-cn
不是很清楚sbcl的情况。ccl编码这方面倒是很复杂的,转换的地方非常多。另外,你用了sb-impl的内部符号,这本身就不是正确的做法。

你的程序看起来也没做什么,看描述一时间也无法确定在哪个环节。如果你用bash脚本或者c写一遍,还是问号吗?


Liutos <mat.l...@gmail.com> 于 2020年1月4日周六 16:39写道:
--
--
Lisp-cn(Lisp中文用户组)
CLUG https://lisp-cn.com
---
您收到此邮件是因为您订阅了Google网上论坛上的“Lisp-cn(Lisp中文用户组)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到lisp-cn+u...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/lisp-cn/CAAxQUKaBmZh7ymA7z3UU8Wzp4jVUGmv5HeemeaGpBFHabvpaXA%40mail.gmail.com

Liutos

unread,
Jan 5, 2020, 3:28:57 AM1/5/20
to lis...@googlegroups.com
第一版是用 shell 写的,单纯地用 echo 输出内容即可,是可以成功在 BitBar 中显示出中文内容的。

Xiaofeng Yang <n.akr....@gmail.com> 于2020年1月4日周六 下午11:08写道:

Xiaofeng Yang

unread,
Jan 5, 2020, 8:11:37 AM1/5/20
to lisp-cn
问号一般是编码转换过程中,目标编码没有对应的字,于是用问号代替。
按照CL的尿性,这个过程从读入源码开始到输出的整个过程都受影响。
为了确定到底是在哪个过程中出的问题,提几个思路,你或许可以试一试。

* 确保你的sbcl编译的时候是unicode。非unicode build默认是latin1,unicode build默认根据系统当前环境自动选择变量。
* 用stream-external-format检查输入输出的编码。
* 我不清楚输入输出的过程中是否要经过ros,ros是否会对这个过程造成影响。不妨尝试直接sbcl.exe?ros有部分代码也是CL写的,并不清楚是否有很好的处理编码问题。
* 我不清楚sb-impl:xxx是否有用。即使有效,*standard-output*在你设置这个变量之前已经创建了,external format已经固定了,我想应该是不会影响到的。可以试试这几个方法:
1. 看看sbcl.exe是否有命令行参数来指定。
2. 环境变量,比方说LANC=xxx
3. 替换现有的标准输出流(当然你替换的只是CL层面的object)。


     Best regards,
Xiaofeng Yang


Reply all
Reply to author
Forward
0 new messages