UTF-8的交叉编译ncurses显示不正确

Scappoose的安德鲁

我有一个嵌入式系统,带有一个vt52u(unicode)终端仿真器,可以正确显示UTF-8字符,但是我有交叉编译的程序(vim和python),当使用ncursesw库时,该程序无法在该终端上正确显示unicode字符。

我已经完成搜索,但是网上似乎没有任何帮助...

Bash shell设置了以下变量:

LANG=en_US.UTF-8
LD_LIBRARY_PATH=/mnt/sd/lib  # all libraries, cross compiled, are located here
TERM=vt52u
TERMCAP='vt52u|vt52 with UTF-8:am:eo:rs=\Ee\Eb0\Eco:is=\EE\Ee:nl=^j:sr=\Ei:bl=^g:ta=^i:ho=\EH:cr=^m:le=\ED:nd=\EC:do=\EB:up=\EA:ta=^i:nw=^m:xn:cm=\EY%+ %+ :it#8:co#75:li#24:sc=\Ej:rc=\Ek:vi=\Ef:ve=\Ee:so=\Eb0\Ec4:se=\Eb0\Eco:mh=\Eb8\Eco:mr=\Ebo\Ec0:me=\Eb0\Eco:cl=\EH\EJ:cd=\EJ:ce=\EK:km:ku=^p:kd=^n:kr=^f:kl=^b:kb=^h:'
LOCALE=

而且我知道unicode终端很好,因为我可以运行以下程序来使其完美显示UTF-8字符。

#!/bin/env python
#coding=UTF-8

charset = [
0x2205, 0x2629, 0x00B2, 0x2663, 0x2666, 0x00B1, 0x221A, 0x266B,
0x2190, 0x2524, 0x2500, 0x2534, 0x253C, 0x251C, 0x2193, 0x2191,
0x00B0, 0x2665, 0x00AE, 0x2660, 0x00B7, 0x00A4, 0x00A4, 0x00A4,
0x00D7, 0x00B5, 0x2126, 0x252C, 0x250C, 0x2510, 0x2514, 0x2518
]

for i in charset:
    print unichr( i ).encode("UTF-8"),
    if i == 0x2191: print
print


bash-4.3#./testunicode
bash-4.3# ∅ ☩ ² ♣ ♦ ± √ ♫ ← ┤ ─ ┴ ┼ ├ ↓ ↑
bash-4.3# ° ♥ ® ♠ · ¤ ¤ ¤ × µ Ω ┬ ┌ ┐ └ ┘

但是,当我尝试在python程序中使用curses(ncursesw)来显示要显示的绘图字符的框时,或者使用vim(链接到ncursesw)编辑UTF-8文本文件时;最后,我在屏幕上打印了一个无效的unicode框,其后是每个Unicode字符的额外符号,如〜T〜B,〜T〜L以及许多其他变体。因此,出于某些原因,ncursesw输出无效的UTF-8字符...。

我知道它是正确链接的,并且没有冲突的ncurses库。仅存在ncursesw。

我配置了ncurses-5.9库进行如下编译:

./configure --prefix=/mnt/sd --without-cxx --without-cxx-binding --without-ada --without-manpages --without-progs --without-tests --without-curses-h --with-build-cc=gcc --with-shared --without-normal --without-debug --without-profile --without-gpm --without-dlsym --without-sysmouse --build=i686-linux --host=arm-linux-gnueabi --without-pthread --enable-widec --with-fallbacks=vt52 --with-terminfo-dirs=/etc/terminfo --disable-big-core --enable-termcap --with-termpath=/Data/termcap

例如:以下程序在我的台式机Linux〜VT102上可以正常运行-但是在vt52u上运行时,嵌入式系统将无法正常运行:

#!/bin/env python
# coding=UTF-8
board=[
"","",
u"   ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐",
u"   │   │   │   │   │   │   │   │   │   │   │   │   │   │   │   │   │",
u"   │   │ ├───→───→───→ │   │   │   │   │   │ ├───→───→───→ │   │   │" ]

board = ( i.encode("utf-8") for i in board )

import curses
import locale
locale.setlocale( locale.LC_ALL,"" )

screen = curses.initscr()
curses.noecho() # no echoing
curses.cbreak() # no keyboard buffering

# Setup the playing board screen. 
for i,s in enumerate( board ): screen.addstr( i,0,s )
screen.refresh()

import time
time.sleep(2)

# Return everything to normal
curses.echo()
curses.nocbreak()
curses.endwin()

编辑:我发现了该错误的一个可能原因-glibc被交叉编译,没有到/ mnt / sd / share / i18n / charmap或/ mnt / sd / share / i18n / locales目录的正确路径。它仅包含以错误的“ /”作为前缀的Make或Configuration的部分路径,而不是目标系统的实际根路径/ mnt / sd。如果找不到文件,则glibc显然默认返回到“ C”或“ POSIX”语言环境,并忽略环境变量。

我不确定是否必须重新编译glibc并手动编辑makefile,或者是否有办法在系统构建后手动设置路径。有任何想法吗。???

Scappoose的安德鲁

Ncurses依赖于标准C库,该库需要在其中包含国际化文件的目录的路径中进行编译,否则NCURSES将自动默认返回POSIX语言环境(也称为“ C”语言环境),并且不会执行UTF-8。

在将语言环境存储在与主机不同的位置的构建系统上进行交叉编译会导致自动配置脚本误识别目录,然后即使正确设置了语言环境变量,嵌入式系统也将无法执行UTF-8。 ..更糟糕的是,故障可能不会产生任何错误消息。

但是:如果路径错误,那么在运行时,除了POSIX&C,您将看不到任何语言环境:

locale -a

解决此问题的一种方法是在构建系统上使用国际化文件设置虚拟目录,然后重新编译标准C库。但它可能需要root特权。

另外,在使用gnu标准C库(glibc)时,可以设置环境变量“ I18NPATH”。它应该覆盖已编译的路径。如果嵌入式系统上的安装前缀为“ / mnt / sd”,则从bash shell中执行-只需执行以下操作:

export I18NPATH="/mnt/sd/share/i18n"

无论哪种情况,一旦纠正的路径可用/已安装,系统都将正常运行。如果不是,请检查以确保国家(地区)charmap和UTF-8的组合实际上已生成了语言环境(使用“ locale -a”列出所有语言环境)。

如果它不存在,则可以使用“ localedef”实用程序非常简单地创建它。例如:要创建具有UTF-8支持的美国英语语言环境,只需执行以下操作:

localedef -i en_US -c -f UTF-8 en_US.UTF-8

然后,请确保已设置并导出了语言环境变量:

export LOCALE=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

然后在不带参数的情况下运行语言环境应将所有变量显示为en_US.UTF-8 ...从那时起一切都会正常运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQLplus和Oracle,UTF-8显示不正确

来自分类Dev

UTF-8字符在PHP中显示不正确(从MYSQL输出结果时)

来自分类Dev

在Android Studio中以JSON显示波斯语UTF8的不正确数据

来自分类Dev

输入的UTF-8不正确,表示编码

来自分类Dev

输出CSV文件编码不正确的UTF-8

来自分类Dev

UTF-8中文字符在Weblogic 10.3中显示不正确,但在Tomcat 6中却不正确

来自分类Dev

UTF8文本正确,但保存不正确

来自分类Dev

PHP中的错误?:XMLReader :: readOuterXml当输入IS UTF-8时生成“输入不正确的UTF-8”

来自分类Dev

从UTF-8文件读取时字符数字不正确

来自分类Dev

解码不正确的UTF-8字符串

来自分类Dev

OpenBSD 6.2上vi / vim中的UTF-8配音不正确

来自分类Dev

XMLSyntaxError:输入不正确的UTF-8,表示编码,Odoo

来自分类Dev

rvest read_html 输入不正确 UTF-8 编码错误

来自分类Dev

R 错误:1:输入的 UTF-8 不正确,请指出编码!XML到列表

来自分类Dev

MSVC UTF8字符串编码使用不正确的代码点

来自分类Dev

XML错误:输入的UTF-8不正确,表示编码!从PHP5更改为PHP7之后

来自分类Dev

为什么ElementTree拒绝带有“编码不正确”的UTF-16 XML声明?

来自分类Dev

在Gradle中正确显示UTF-8文本

来自分类Dev

使git diff正确显示UTF8编码的字符

来自分类Dev

输出无法正确显示所有utf-8

来自分类Dev

输出无法正确显示所有utf-8

来自分类Dev

如何使用Bootstrap正确显示UTF-8?

来自分类Dev

UTF-8 字符无法以 JSON 格式正确显示

来自分类Dev

Unicode与UTF-8

来自分类Dev

UnicodeDecodeError:“ utf-8”

来自分类Dev

PHP UTF 8问题

来自分类Dev

utf-8的问题

来自分类Dev

终端+ SSH不能正确显示UTF

来自分类Dev

终端+ SSH不能正确显示UTF

Related 相关文章

热门标签

归档