我刚刚安装了Linux Mint 17并遇到了一个问题,我无法在终端中使用俄语.(我看到的?不是字母).在一个论坛上我发现了这个解决方案
在〜/ .profile中添加:
export LANG=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
Run Code Online (Sandbox Code Playgroud)
它有所帮助,但也将我的界面语言改为俄语(我不想要).这甚至不是问题,但无论如何,我想知道,这段代码是如何工作的(每一行).
谢谢.
rod*_*igo 42
我将详细解释:
export LANG=ru_RU.UTF-8
Run Code Online (Sandbox Code Playgroud)
这是一个shell命令,它将导出一个以LANG给定值命名的环境变量ru_RU.UTF-8.这指示国际化程序使用俄语(ru),俄罗斯(RU)的变体,以及UTF-8控制台输出的编码.
通常这条单线足够了.
另一个:
export LC_CTYPE=ru_RU.UTF-8
Run Code Online (Sandbox Code Playgroud)
有类似的事情,但它告诉程序不要改变语言,但只有CTYPE到俄语.如果程序可以将文本更改为大写,那么它将使用俄语规则来执行此操作,即使文本本身可能是英语.
值得一提的是,混合LANG并LC_CTYPE可以产生意想不到的结果,因为很少有人这样做,所以它是非常未经测试的,除非可能:
export LANG=ru_RU.UTF-8
export LC_CTYPE=C
Run Code Online (Sandbox Code Playgroud)
这将使程序输出俄语,但CTYPE标准旧C风格.
最后一行LC_ALL是最后一个覆盖,它将使程序忽略所有其他LC_*变量并使用它.我认为你不应该在配置文件中写它,而是用它来运行给定语言的程序.例如,如果要编写错误报告,并且不希望任何类型的本地化输出,并且您不知道LC_*设置了哪些变量:
LC_ALL=C program
Run Code Online (Sandbox Code Playgroud)
关于更改所有程序的语言或仅更改控制台,这取决于您放置这些行的位置.我把它放进去,~/.bashrc所以它们不适用于GUI,只适用于bash控制台.
Jen*_*ens 21
请参阅UNIX规范的环境变量页面:
LANG此变量确定的语言环境类别的母语,本地海关和编码字符在不存在的设定LC_ALL等LC_*(LC_COLLATE,LC_CTYPE,LC_MESSAGES,LC_MONETARY,LC_NUMERIC,LC_TIME)的环境变量.应用程序可以使用它来确定用于错误消息和指令的语言,整理序列,日期格式等.
LC_ALL此变量确定所有区域设置类别的值.所述的值LC_ALL的环境变量具有超过任何起始以LC_(LC_COLLATE,其他环境变量的优先级LC_CTYPE,LC_MESSAGES,LC_MONETARY,LC_NUMERIC,LC_TIME)和LANG环境变量.
LC_CTYPE此变量确定字符处理函数的区域设置类别,例如tolower(),toupper()和isalpha().此环境变量将文本数据的字节序列解释为字符(例如,单个 - 而不是多字节字符),字符分类(例如,alpha,数字,图形)和字符类的行为.此变量的其他语义(如果有)与实现有关.
export令人困惑。 这真的意味着mark-for-export。
这意味着稍后将创建子进程,这就是实际导出的时间。
export事件的顺序是:1-ASSIGN、MARK和... 2-FORK。
1)创建一个新的本地shell变量,赋值给它,并标记这个变量以备以后导出。
2)然后,如果当前 shell 脚本被 FORKED,(即创建和运行任何子进程),然后使用此导出变量的 COPY 启动子进程,作为它的众多环境变量之一。
nb(注意):直到第 2 步,并且可能在export声明发布很久之后,变量才真正被导出。 所以: export只标记LANG。它不导出 LANG。
按照惯例,导出的变量以大写命名。
因为 LANG 只是一个副本,如果孩子以后修改这个变量,它只会为自己修改。父级看不到子级的修改。
请注意,还有许多其他环境变量从父进程传递给子进程。这些包括父进程也从其父进程获取的所有其他环境变量。
因此,子级继承了父级的所有环境变量,
+ 父级标记为 的任何其他环境变量export,
- 减去任何显式为 的变量unset。
换句话说,我们有两个进程需要考虑:父进程和任何未来的子进程。
在这种情况下profile,您正在运行的进程就是我们所说的“父进程”。
profile可以产生一个或多个子进程,例如,如果您在配置文件中执行的一项操作是运行程序。该程序然后(通常)作为profile. (如果文件来自配置文件,使用. <name>orsource <name>表示法,其中来源的内容与profile.在同一进程中运行,则情况并非如此。)
Run Code Online (Sandbox Code Playgroud)export LANG=ru_RU.UTF-8 export LC_CTYPE=ru_RU.UTF-8 export LC_ALL=ru_RU.UTF-8
那么现在让我们来看看这三个环境变量的影响。
LANG 是用户通常设置以影响程序运行的语言。在终端中输入时,env | grep LANG您应该看到 LANG 设置为您的<language>_<country-code>.<character-encoding>,例如 LANG=en_US.UTF-8。
LC_CTYPE 是 LANG 的覆盖,并且仅覆盖所使用的字符集。LANG 的所有其他功能(类别)仍然按照 LANG 的设置使用,例如 LC_TELEPHONE。
LC_ALL 是进一步的覆盖。它覆盖 LC_CTYPE 和 LANG 为给定语言和代码集设置的所有语言环境类别。请注意,永远不应像配置文件本身那样持久设置 LC_ALL。它仅用作临时的整个语言环境覆盖,即覆盖所有类别,如 LC_TELEPHONE、LC_MONETARY、LC_CTYPE 等。
的LANG,LC_CTYPE和LC_ALL特殊环境,在他们得到远销shell环境(变量help export),它们可用且准备通过它支持的语言环境(自然语言格式化C)某些程序读取。
每个变量为特定的例程集设置 C 库的自然语言格式样式的概念,例如:
LC_ALL- 一般设置整个语言环境LC_CTYPE- 为ctype和multibyte功能设置语言环境。这控制对大写和小写、字母或非字母字符等的识别。
和其他例如LC_COLLATE(用于字符串整理例程)、LC_MESSAGES(用于消息目录)、LC_MONETARY(用于格式化货币值)、LC_NUMERIC(用于格式化数字)、LC_TIME(用于格式化日期和时间)。
关于LANG,它被用作任何未设置LC_*变量的替代品(见:)man locale。
见:man setlocale(BSD),man locale
所以,当某些C函数调用(如setlocale,ctype,multibyte,catopen,printf,等),他们为了读取配置文件和本地环境的区域设置,以控制和格式自然语言的格式类型按照C编程语言标准(见:ISO C99 )
另请参阅:C 库 - <locale.h>。
| 归档时间: |
|
| 查看次数: |
40247 次 |
| 最近记录: |