QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: firefly

英文間距太大的解決方法

[复制链接]
发表于 2005-1-31 07:49:54 | 显示全部楼层
问题是 有的大  有的正常 ..这是咋个回事
回复

使用道具 举报

发表于 2005-4-10 11:55:21 | 显示全部楼层

Re: 英文間距太大的解決方法

[quote:8f2667ba67="firefly"]首先,我先解釋為什麼會有英文間距過大的問題:

TrueType 字體分成兩種,一種是可變字距,也就是每個字符寬度不一樣,比如 "x" 與 "i",這兩個字符就不等寬,它是在每個字符中紀錄該字符的寬度,大多數的 TrueType 都是這種格式。

另一種就是固定字距。也就是每個字符寬度都一樣,這樣顯示或打印時,會有對齊效果,比較美觀,在英語環境中,不會有任何問題,聰明的您,知道問題所在了吧 :-)

沒錯!CJK 的等寬字體,包含『半寬英數字符』與『全寬 CJK 字符』,字型引擎會把全寬字寬度套用在半寬字上頭,造成半寬字看起來間距太大,這就是問題所在。

這裡提供一個方法,讓字型引擎忽略 CJK 字體指定的寬度,您可以將以下這段內容,複製到 /etc/fonts/fonts.conf 或是 /etc/fonts/local.conf 中:
[code:1]
<match target="font">
        <test target="pattern" name="lang" compare="contains">
                <string>zh-tw</string>
                <string>zh-cn</string>
                <string>ja</string>
                <string>ko</string>
        </test>
        <test name="spacing" compare="eq">
                <const>mono</const>
        </test>
        <edit name="globaladvance" mode="assign">
                <bool>false</bool>
        </edit>
</match>
[/code:1]
以上那段的意思是:當遇到 CJK 字型,又是等寬時,忽略系統內定寬度,這樣,當系統使用 CJK 等寬字時,便不會再有間距過大的問題。[/quote]
借帖一问到底是zh-cn还是zh_cn
回复

使用道具 举报

发表于 2005-6-6 10:21:48 | 显示全部楼层
告诉我们方法论比直接写出代码更好,各位,能解释一下,代码为什么这样写?
回复

使用道具 举报

发表于 2005-6-6 23:41:12 | 显示全部楼层
[quote:6e528e881a="rokeeme"]告诉我们方法论比直接写出代码更好,各位,能解释一下,代码为什么这样写?[/quote]
http://www.linuxfans.org/nuke/modules.php?name=News&file=article&op=view&sid=1184
回复

使用道具 举报

发表于 2005-6-7 09:36:19 | 显示全部楼层
Linux的字体引擎已经统一采用fontconfig+xft2体系。Fontconfig负责字体的安装确认和匹配,xft2则负责字体渲染。这篇翻译的Fontconfig手册希望可以让大家更深入地了解Fontconfig的配置和机理。

原文:http://www.fontconfig.org/fontconfig-user.html
作者:Keith Packard , HP Cambridge Research Lab
翻译:Conner Mo   ([email protected])  中国Linux公社 (www.linuxfans.org )

Fonts-conf

名称

fonts.conf - 字体配置文件


文件纲要

/etc/fonts/fonts.conf
/etc/fonts/fonts.dtd
~/.fonts.conf


描述

fontconfig 是提供系统范围内字体设置,定制和允许应用程序访问的函数库。

功能概述

fontconfig 包含两个基本的模块,即读取XML文件并建立内部配置的配置模块和接受请求的字体样板并返回最接近所需字体的匹配模块。

字体设置
fontconfig的配置模块由FcConfig 数据类型,libexpat和FcConfigParse 组成。它扫描一个XML树并将其中的数据处理成一个配置文件。从外部来看,函数库的配置就是生成一个有效的XML树并将其填充到FcConfigParse里。应用程序改变运行中的函数库配置的唯一途径就是添加字体和目录到用户的字体文件列表中。

这样做的目的就是让字体的配置变得相对静态,并且可以尽可能多地让其他应用程序共享。这种做法预计可以在应用程序相互传递字体名称的时候获得相对稳定的字体选择。XML被选为配置文件的标准格式是因为它是一个既便于外部程序编辑又可以保留正确结构和语法的格式。

字体的配置和字体的是分开的。需要采取自身特定匹配方式的应用程序可以从库中访问已有的字体并执行独立的匹配操作。这样做是为了让应用程序可以从字体库中挑选并选定合适的库功能,而不是强迫他们选择这个库或者私有的设置机制。这种做法预计可以让所有应用程序的字体配置可以集中在一处。集中的字体配置可以标准化和简化字体安装和定制。

字体属性

虽然字体样板可能包含任意基本属性,但还是有一些众所周知的属性及其附带的类型。Fontconfig利用这些属性来匹配和完成字体配置。其他属性则被用来为应用程序的渲染机制提供方便。

属性
类型
描述

family
String
字体家族名称 (宋体,仿宋体等)

style
String
字体风格,包括粗度(weight)和倾斜度(slant)。

slant
Int
倾斜度,分为Italic(斜体), oblique(倾斜罗马体)或者roman(罗马体)

weight
Int
Light (微粗),medium(稍粗),demibold(略粗),bold(粗)或者black(黑体)

size
Double
尺寸大小

aspect
Double
在微调(hinting)前水平拉伸字体

pixelsize
Double
像素大小

spacing
Int
间距,Proportial (可变),monospace (等宽) 或者charcell (字符单元)

foundry
String
字体厂商名称

antialias
Bool
字体渲染是否采用抗锯齿功能

hinting
Bool
渲染引擎是否采用微调

verticallayout
Bool
采用竖直排版

autohint
Bool
采用自动微调代替普通微调

globaladvance
Bool
使用字体全局间距数据

file
String
存储字体的文件名称

index
Int
字体文件内的字体索引

ftface
FT_Face
使用指定的Freetype格式对象

rasterizer
String
正在使用的渲染引擎

outline
Bool
字型是否中空

scalable
Bool
字型是否可以放缩

scale
Double
尺寸->像素的放缩比例

dpi
Double
目标点数/英寸

rgba
Int
unkonw, rgb, brg, vrgb, vbgr, none -子像素的几何排列

minspace
Bool
是否采用最小行间距

charset
CharSet
字体的编码

lang
String
字体支持的RFC-3066-style 语言列表。



字体匹配

Fontconfig用计算输入的字体样板和现有系统中字体的距离来实现字体匹配。最接近的字体将被选择。这样可以保证任何时候都能够返回一个字体,但不能保证它和所需要的样板类似。

字体的匹配是从应用程序所创建的样板开始的。请求字体的所有属性会被搜集到一个样板里。每个属性可以包含一个或多个值。它们按照优先等级排列。匹配列表前的被认为是比符和列表后的更加接近所需属性。

最初的字体样板会按照配置文件中的编辑指令按顺序修改。每个修改的过程包括匹配和其它一系列的编辑操作,并且每个匹配的过程都会执行相应的编辑操作。

当字体样板编辑修改完后,将会执行一系列默认的替换操作,从而标准化已有的一套属性。这样可以避免较低层程序在渲染的时候为不同的字体属性提供一成不变的默认值。

标准化后的字体样板最后将和系统所有拥有的字体进行匹配。样板和字体的距离是用它的每个属性,厂商,编码,家族,语言,间距,像素大小,风格,斜度,粗度,防锯齿,渲染引擎和中空测量出来的。这个列表是按照优先级排序的,排在前面的元素比后面的元素占的比重大。

这个规则中有一个特殊的例子:家族的名称分成两个部分,strong(强)和weak (弱)。强家族名称在匹配中比语言元素优先级要高,而弱家族名称在匹配中比语言元素的优先级别要低。这样允许在文档指定字体都不存在的时候,文档的语言属性可以指导字体的选择。

代表所属字体的样板会包含所有在那个样板找到的属性,而不只是在字体中找到的。这允许应用程序通过匹配系统传送渲染指令和其它数据。最后,在配置文件中找到字体的编辑指令列表将被应用到样板。修改过的样板会返回给应用程序。

返回的值包括充足的字体定位和渲染信息,包括文件名,像素大小和其他渲染数据。因为没有任何包含的信息属于Freetype库,引用程序可以自由选择渲染引擎,甚至直接获取和访问字体文件。

在编辑文件中,匹配和编辑的序列是按照两步执行的,因为需要有两个不同操作。第一步是修改如何选取字体,为字体家族取别名和添加合适的默认值。第二步是修改如何渲染已选择的字体。这些步骤必须应用在已选择的字体上,而不是原有的字体样板,因为经常会发生错误的匹配。

字体名称

Fontconfig 为样板提供一个可以让函数库接受和产生的文本表达。表达有三个部分,第一个是字体家族名称列表,第二个是尺寸大小列表,最后是附加属性列表:

<families>-<point sizes>:<name1>=<values1>:<name2>=<values2>...
<家族名称>-<尺寸大小>:<名称1>=<赋值1>:<名称2>=<赋值2>...

在列表中的赋值用逗号分开。名称不需要包含家族或者尺寸大小,它们可以省略。另外,还有一些字符常量可以同时说明名称和赋值。这里有一些例子:

名称
含义

Times-12
尺寸12的Times Roman

Times-12:bold
尺寸12的Times粗体

Courier:italic
Courier默认尺寸的斜体

Monospace:matrix=1 .1 0 1
用户首选的采用人工斜体的等宽字体



语言标记

每种在数据库中的字体包括一个它所支持的语言列表。这是用比较字体的unicode范围和语言的正词法(orthography)计算出来的。语言使用一个兼容RFC-3066的命名标准并且具有两个部分——ISO693语言标记跟一个连字符,然后是ISO3166国家代码。连字符和国家代码可以省略。

Fontconfig在函数库中有几种语言的正词法。除了重新编译函数库外,还没有其他途径添加新的正词法。Fontconfig现在支持ISO639-1中命名的139种语言的122种,ISO 639-2的141种有双字符编码的语言和另外30种三字符编码的语言。

配置文件的格式

Fontconfig的配置文件的存储格式为XML格式。这种格式可以让延伸的配置工具更加方便的编写并且可以保证他们可以生成语法结构正确的文件。由于XML文件是纯文本文件,专家用户可以用文本编辑器处理它们。

Fontconfig 文件类型定义在延伸的实体“fonts.dtd”中,通常存储在默认的字体设置目录(/etc/fonts)。每个配置文件必须包括下列的结构:

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
    ...
    </fontconfig>

<fontconfig>

这是字体配置顶层的单元,可以按照任意顺序包括dir, cache, include, match和alias单元。

dir
这个单元包含一个会被扫描目录名称,扫描到字体文件将被包括到可用的字体列表中里。

cache
这个单元包含一个为每个用户设置的缓存字体信息的文件名称。如果它以“~”开始的话,代表一个在用户主目录的文件。这个文件是用来保留在为每个目录设置的缓存文件中没有的字体信息的。Fontconfig将会自动处理缓存文件。默认的缓存文件是“~/.fonts.cache-version”,这里version是字体配置文件的版本号。(目前是1)。

include ignore_missing="no"

这个单元包含一个附加的配置文件名称。当XML数据类型被FcConfigParse扫描处理后,这个文件的内容也将会通过传送文件名称到FcConfigLoadAndParse,从而被包括在配置中。如果“ignore_missing”设成“yes”而不是默认的“no”的话,一个丢失的文件将不会引起函数库的警告信息。

config

这个单元提供一个整合附加的配置信息的地方。config可以按照任意顺序包含blank和rescan单元。

blank

字体通常包含“破碎”的字型,它们在编码中存在但在屏幕上却被绘制成空白。我们在blank单元中放置每个预计是空白的unicode字符到int单元中。这些绘制为空白的字符将从字体支持的字符集中忽略。

rescan

rescan单元存放一个表示自动扫描字体配置文件变化间隔时间的int单元。每次间隔过后,Fontconfig都将验证所有的配置文件和目录并且自动重建内部的数据结构。

match target="pattern"

这个单元先存放(可能是空的)test元素列表,然后是一个edit元素列表(也可能是空的)。匹配检测(test元素)条件的样板将受到edit元素列表的影响。如果“target”设定为“font”而不是默认的“pattern”的话,那么这个单元就将应用到一个匹配后的字体名称,而不是一个需要匹配的字体样板。

test qual="any" name="property" compare="eq"

这个单元包含一个单独的值,用来和样本的属性“property”比较(可以替换property为任意一个上面列出的属性)。“compare”可以是“eq”(等于),“not_eq”(不等于),“less”(小于),“less_eq”(小于等于),“more”(大于),“more_eq”(大于等于)。“qual”可以为默认的“any”,在这种情况下,只要任意一个之字体属性符合比较的值,匹配就成功。如果“qual”为“all”的话,只有当所有的字体属性都符合比较的值的时候,匹配才成功。

edit name="property" mode="assign" binding="weak"

这个单元包括一个表达式单元的列表(任何赋值和操作单元)。表达式单元将在运行的时候被执行并且将修改属性“property”。是否修改依赖于“property”的值是否匹配相应的test单元。如果匹配的话,这个修改将会影响第一个匹配的值。任何插入到属性的值都可以给出绑定(binding)说明。“mode”可以是以下列表其中的一个:

Mode
有匹配条件
没有匹配条件

"assign"
替换匹配的值
替换所有值

"assign_replace"
替换所有值
替换所有值

"prepend"
在匹配前插入
在列表头部插入

"prepend_first"
在列表头部插入
在列表头部插入

"append"
在匹配后添加
在列表底部添加

"append_last"
在列表底部添加 在列表底部添加


int, double, string, bool

这些单元保存单独一个声明的类型。bool 单元保存true或者false。在赋浮点数的时候有一个重要的限制——fontconfig要求尾数必须以一个数字开始,而不是一个小数点,所以应该碰到纯小数的时候应该插入一个起始的"0"。(例如用0.5而不是.5,-0.5而不是-.5。)

matrix

这个单元保存一个防射变换的四个double元素。

name

保存一个属性名称。从字体属性的第一个值判断出来的,而不是样板的第一个值。

const

保存一个常量的名称。以下这些数值总是整数并且作为一般字体值的字符表达。

常量
属性


light
weight
0

medium
weight 100

demibold
weight
180

bold
weight
200

black
weight
210

roman
slant
0

oblique
slant
110

proportional
spacing 0

mono
spacing
100

charcell
spacing
110

unknow
rgba
0

rgb rgba
1

bgr
rgba
2

vrgb
rgba
3

vbgr
rgba
4

none
rgba
5



or(与), and(或), plus(加), minus(减), times(乘), divide(除)

这些元素在一个表达试列表上执行特定的操作。or和and是布尔操作,不是位操作。

eq(等于), not_eq(不等于), less(小于), less_eq(小于等于), more(大于), more_eq(大于等于)

这些元素比较两个值,产生一个布尔值。

not

对一个表达式的布尔值进行“非”操作。

if

这个单元包含三个表达单元。如果第一个单元为真,则产生第二个单元的值,否则产生第三个单元的值。

alias

Alias (别名)单元为需要替代一个字体家族名称到另一个的一套通用匹配操作提供简化符号。它们包含一个family单元,紧跟着是可选的prefer,accept和default单元。匹配family单元的字体将被编辑,使得prefer家族在匹配family的前面,accept家族在匹配的family后面并且default家族在家族列表的最后。

family

保存一个单独的字体家族名称

prefer, accpet, default  

这些单元保存一个让alias单元使用的字体列表。

配置文件举例


系统配置文件
这是一个系统范围的配置文件例子

<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><!-- /etc/fonts/fonts.conf 配置系统自体的文件 --><fontconfig><!--         在以下目录寻找字体--><dir>/usr/X11R6/lib/X11/fonts/truetype</dir><dir>/usr/X11R6/lib/X11/fonts/Type1</dir><!--        接受不受欢迎的'mono'别名,用'monospace'替代它。--><match target="pattern">        <test qual="any" name="family"><string>mono</string></test>        <edit name="family" mode="assign"><string>monospace</string></edit></match><!--        没有使用众所周知别名的名称将用'sans'赋值。--><match target="pattern">        <test qual="all" name="family" mode="not_eq">sans</test>        <test qual="all" name="family" mode="not_eq">serif</test>        <test qual="all" name="family" mode="not_eq">monospace</test>        <edit name="family" mode="append_last"><string>sans</string></edit></match><!--        读入用户配置文件,如果不存在的话不发出警告信息。--><include ignore_missing="yes">~/.fonts.conf</include><!--        创建众所周知的字体名称别名到可用的Truetype字体。        将Type1字体类别替代为Truetype字体类别可以提高屏幕显示质量。--><alias>        <family>Times</family>        <prefer><family>Times New Roman</family></prefer>        <default><family>serif</family></default></alias><alias>        <family>Helvetica</family>        <prefer><family>Verdana</family></prefer>        <default><family>sans</family></default></alias><alias>        <family>Courier</family>        <prefer><family>Courier New</family></prefer>        <default><family>monospace</family></default></alias><!--        为标准名称提供所需的别名。        在用户文件后面进行可以让所有的别名都可以使用所推荐的别名。--><alias>        <family>serif</family>        <prefer><family>Times New Roman</family></prefer></alias><alias>        <family>sans</family>        <prefer><family>Verdana</family></prefer></alias><alias>        <family>monospace</family>        <prefer><family>Andale Mono</family></prefer></alias></fontconfig>   
用户配置文件
这是一个以用户为单位的字体配置文件例子,文件名为 ~/.fonts.conf

<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><!-- ~/.fonts.conf 用户的字体配置文件 --><fontconfig><!--        用户字体文件目录--><dir>~/misc/fonts</dir><!--        使用rgb子像素显示顺序来提高字型在液晶显示器上的显示效果。效果会影响渲染,        但不会影响匹配。记得应该总是使用target="font"。--><match target="font">        <edit name="rgba" mode="assign"><const>rgb</const></edit></match></fontconfig>   


文件

fonts.conf        包含了fontconfig函数库的配置信息,其中有用来寻找字体及相关信息的目录名称,还有在尝试匹配现有字体前执行的字体样板编辑指令。它使用的是xml格式。


fonts.dtd         是一个描述配置文件格式的DTD文件。


~/.fonts.conf   是当前用户字体配置的默认位置,实际的位置可以在fonts.conf文件里指定。


~/.fonts.cache-* 是在没有发现字体目录中的缓存文件时,在当前用户目录存储字体信息的文件。这个文件是fontconfig自动维护的。



版本号
Fontconfig version2.2.0
回复

使用道具 举报

发表于 2005-9-23 20:22:53 | 显示全部楼层
还是说一句
最根本的解决应该是这样
如果可以的话,对于中英文分别指定字体
否则统一指定英文字体
回复

使用道具 举报

发表于 2005-9-23 20:24:56 | 显示全部楼层
[quote:14c1c69feb="BOoRFGOnZ"]问题是 有的大  有的正常 ..这是咋个回事 [/quote]
很多程序需要单独指定字体
比如虽然firefox用gtk写成
但是它不理会gtkrc
回复

使用道具 举报

发表于 2005-10-11 03:50:14 | 显示全部楼层
[quote:212ecefc1b="Kingo"][code:1]<match target="font">
                <test target="pattern" name="lang" compare="contains">
                        <string>zh-tw</string>
                        <string>zh-cn</string>
                        <string>ja</string>
                        <string>ko</string>
                </test>
                <edit name="spacing">
                        <const>proportional</const>
                </edit>
                <edit name="globaladvance">
                <bool>false</bool>
                </edit>
        </match>[/code:1][/quote]

Kingo's work well !
回复

使用道具 举报

发表于 2005-10-18 10:49:06 | 显示全部楼层
谢谢,,解决了 啊 !!
比以前的 看着顺眼多了
回复

使用道具 举报

发表于 2005-10-18 22:34:37 | 显示全部楼层
谁给fontconfig写一个补丁,把这些问题搞定?
回复

使用道具 举报

发表于 2006-7-6 22:28:32 | 显示全部楼层

我的 方法很简单

改LANG=en_US.utf8
LC_CTYPE=zh_CN.utf8
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-26 21:26 , Processed in 0.051327 second(s), 12 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表