如何在 MacOS 中查找东亚字符的默认字体
How to find the default font for East Asian character in MacOS
使用文本编辑应用程序时,选择字体(例如"Menlo")以呈现字形,当所选字体不包含特殊字形时(例如“”,这是一个简单的中文glyph, "Menlo" 不包含), 应用程序会选择一种字体来呈现它, 在 MacOS(Catalina) 中, 大约有 62 种字体 (STBaoliSC-Regular, STKaiti, STSong, PingFangSC-Regular. ..) 包含这个字形“”,我发现几乎每个文本编辑应用程序(vscode、sublime text、TextEdit)都选择相同的字体——"PingFangSC-Regular",所以我考虑是否是每个字形有自己的默认字体?如果是这样,我怎样才能得到字体名称?
这由 "cascade list." 处理如果您想要默认列表,可以通过 CTFontCopyDefaultCascadeListForLanguages
获得,基于每种字体:
import CoreText
let font = CTFontCreateWithName("Helvetica" as CFString, 12, nil)
let descriptors = CTFontCopyDefaultCascadeListForLanguages(font, nil)! as! [CTFontDescriptor]
如果你想看这个列表,你可以这样做(Core Text 没有很好地桥接 Swift):
for descriptor in descriptors {
let attributes = CTFontDescriptorCopyAttributes(descriptor) as! [String: Any]
print(attributes[kCTFontNameAttribute as String]!)
}
==>
LucidaGrande
.AppleSymbolsFB
GeezaPro
NotoNastaliqUrdu
Thonburi
Kailasa
PingFangSC-Regular
PingFangTC-Regular
AppleSDGothicNeo-Regular
PingFangTC-Regular
PingFangSC-Regular
PingFangHK-Regular
PingFangSC-Regular
HiraginoSans-W3
HiraginoSansGB-W3
KohinoorBangla-Regular
KohinoorDevanagari-Regular
KohinoorGujarati-Regular
MuktaMahee-Regular
NotoSansKannada-Regular
KhmerSangamMN
LaoSangamMN
MalayalamSangamMN
NotoSansMyanmar-Regular
NotoSansZawgyi-Regular
NotoSansOriya
SinhalaSangamMN
TamilSangamMN
KohinoorTelugu-Regular
NotoSansArmenian-Regular
EuphemiaUCAS
Menlo-Regular
STIXGeneral-Regular
Galvji
Kefa-Regular
.NotoSansUniversal
AppleColorEmoji
PingFangSC-Regular 是列表中的第一个东亚字体,因此它将被选为替代 Helvetica 的字体。它也是 Lucida Grande 和 Helvetica Neue 级联列表中的第一个东亚字体。而且它是一种直截了当甚至无聊的字体。但是,如果您使用的是更不寻常的字体,例如 American Typewriter?嗯,那就换成轻一点的松体。 Marker Felt 替换为 Kaiti,它在冲程宽度上有更多变化(尽管在 IMO 中,用 Kaiti Black 而不是 Regular 替换它会好得多)。我不知道有什么内置的亚洲字体与可用的拉丁字体一样 "fun",但是如果你有的话,你可以自定义级联列表来选择它(在 [=28= 上使用 NSFontDescriptor ],或 iOS 上的 UIFontDescriptor)。
如果您想了解有关级联列表的更多详细信息,请参阅 WWDC 2018 视频,Creating Apps for a Global Audience.
使用文本编辑应用程序时,选择字体(例如"Menlo")以呈现字形,当所选字体不包含特殊字形时(例如“”,这是一个简单的中文glyph, "Menlo" 不包含), 应用程序会选择一种字体来呈现它, 在 MacOS(Catalina) 中, 大约有 62 种字体 (STBaoliSC-Regular, STKaiti, STSong, PingFangSC-Regular. ..) 包含这个字形“”,我发现几乎每个文本编辑应用程序(vscode、sublime text、TextEdit)都选择相同的字体——"PingFangSC-Regular",所以我考虑是否是每个字形有自己的默认字体?如果是这样,我怎样才能得到字体名称?
这由 "cascade list." 处理如果您想要默认列表,可以通过 CTFontCopyDefaultCascadeListForLanguages
获得,基于每种字体:
import CoreText
let font = CTFontCreateWithName("Helvetica" as CFString, 12, nil)
let descriptors = CTFontCopyDefaultCascadeListForLanguages(font, nil)! as! [CTFontDescriptor]
如果你想看这个列表,你可以这样做(Core Text 没有很好地桥接 Swift):
for descriptor in descriptors {
let attributes = CTFontDescriptorCopyAttributes(descriptor) as! [String: Any]
print(attributes[kCTFontNameAttribute as String]!)
}
==>
LucidaGrande
.AppleSymbolsFB
GeezaPro
NotoNastaliqUrdu
Thonburi
Kailasa
PingFangSC-Regular
PingFangTC-Regular
AppleSDGothicNeo-Regular
PingFangTC-Regular
PingFangSC-Regular
PingFangHK-Regular
PingFangSC-Regular
HiraginoSans-W3
HiraginoSansGB-W3
KohinoorBangla-Regular
KohinoorDevanagari-Regular
KohinoorGujarati-Regular
MuktaMahee-Regular
NotoSansKannada-Regular
KhmerSangamMN
LaoSangamMN
MalayalamSangamMN
NotoSansMyanmar-Regular
NotoSansZawgyi-Regular
NotoSansOriya
SinhalaSangamMN
TamilSangamMN
KohinoorTelugu-Regular
NotoSansArmenian-Regular
EuphemiaUCAS
Menlo-Regular
STIXGeneral-Regular
Galvji
Kefa-Regular
.NotoSansUniversal
AppleColorEmoji
PingFangSC-Regular 是列表中的第一个东亚字体,因此它将被选为替代 Helvetica 的字体。它也是 Lucida Grande 和 Helvetica Neue 级联列表中的第一个东亚字体。而且它是一种直截了当甚至无聊的字体。但是,如果您使用的是更不寻常的字体,例如 American Typewriter?嗯,那就换成轻一点的松体。 Marker Felt 替换为 Kaiti,它在冲程宽度上有更多变化(尽管在 IMO 中,用 Kaiti Black 而不是 Regular 替换它会好得多)。我不知道有什么内置的亚洲字体与可用的拉丁字体一样 "fun",但是如果你有的话,你可以自定义级联列表来选择它(在 [=28= 上使用 NSFontDescriptor ],或 iOS 上的 UIFontDescriptor)。
如果您想了解有关级联列表的更多详细信息,请参阅 WWDC 2018 视频,Creating Apps for a Global Audience.