Как использовать fcitx-pinyin в докере wechat?

Я создаю образ с помощью wechat.Dockerfile:

      docker build -f wechat.Dockerfile --tag=wechat:0.0.3  .

Вставили в докер-хаб, можете вытащить.

      docker pull yufeiluo/wechat:0.0.3

Запустите его с помощью:

      xhost +
docker run -d --name wechat --device /dev/snd \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       -v $HOME/WeChatFiles:/WeChatFiles \
       -e DISPLAY=unix$DISPLAY \
       -e XMODIFIERS=@im=fcitx \
       -e QT_IM_MODULE=fcitx \
       -e GTK_IM_MODULE=fcitx \
       -e AUDIO_GID=`getent group audio | cut -d: -f3` \
       -e GID=`id -g`  -e UID=`id -u` yufeiluo/wechat:0.0.3

Теперь отсканируйте его с помощью приложения WeChat на мобильном телефоне, вы входите в WeChat. Есть проблема, которую я не могу решить: переключение методов ввода не работает для моего Docker WeChat! Я не могу ввести символ CJK в WeChat, работающем в докере. .
Как можно переписать wechat.Dockerfileсоздать образ, который может использовать fcitx-pinyin в образе докера wechat?

2 ответа

Проблема, по-видимому, заключается в том, что имя акции, соответствующее коду акции 688279 (峰岹科技), при кодировании в GB 2312 генерирует байты, которые являются недопустимыми UTF-8.

В вашем коде вы звоните:

      urllib.request.urlopen(req).read()

который вернет необработанные байты ответа. Предположительно где-то внутри:

      lxml.html.fromstring(data_string)

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

Лучший путь вперед, по-видимому, описан здесь , который декодирует прочитанные байты с кодировкой набора символов, возвращенной как часть ответа HTTP, вместо того, чтобы откладывать доlxmlдля определения кодировки символов. Итак, в данном конкретном случае это включает в себя изменение:

      data_string=urllib.request.urlopen(req).read()

на что-то вроде:

      resource=urllib.request.urlopen(req)
data_string=resource.read().decode(resource.headers.get_content_charset())

Кодировка на целевой веб-странице:gb2312,но если вы его используете, возникает неверная ошибка кодирования, пробовал много раз, наконец установилgbkработает отлично!

      def get_rows(page):
    import urllib.request
    import lxml.html
    url = "http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/profit/"\
          "index.phtml?s_i=&s_a=&s_c=&reportdate=2021&quarter=4&p={}".format(page)
    table_xpath = '//*[@id="dataTable"]'
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    req = urllib.request.Request(url=url, headers=headers)
    data_string=urllib.request.urlopen(req).read().decode('gbk')
    root=lxml.html.fromstring(data_string)
    dtable = root.xpath(table_xpath)[0]
    rows = dtable.xpath('.//tr')
    print(len(rows))
Другие вопросы по тегам