gpt4 book ai didi

ios - CTFontGetGlyphsForCharacters 总是返回 false

转载 作者:可可西里 更新时间:2023-11-01 04:21:22 26 4
gpt4 key购买 nike

请帮助我理解以下代码的问题:

NSString *fontName = @"ArialMT";
CGFloat fontSize = 20.0;
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)fontName, fontSize, NULL);
NSString *characters = @"ABC";
NSUInteger count = characters.length;
CGGlyph glyphs[count];
if (CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[characters cStringUsingEncoding:NSUTF8StringEncoding], glyphs, count) == false)
NSLog(@"*** CTFontGetGlyphsForCharacters failed.");

感谢任何帮助。

最佳答案

您将获得一个包含 UTF-8 编码字符的 C 字符串,然后将其转换为 unichar *。那行不通的。 unichar 是一个 16 位 UTF-16 编码的字符。简单的 C 转换不会转换字符编码。

您需要以 unichar 数组的形式向字符串询问其字符。在 Objective-C 中:

NSString *fontName = @"ArialMT";
CGFloat fontSize = 20.0;
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)fontName, fontSize, NULL);
NSString *string = @"ABC";
NSUInteger count = string.length;
unichar characters[count];
[string getCharacters:characters range:NSMakeRange(0, count)];
CGGlyph glyphs[count];
if (CTFontGetGlyphsForCharacters(fontRef, characters, glyphs, count) == false) {
NSLog(@"*** CTFontGetGlyphsForCharacters failed.");
}

在 Swift 中,您可以通过询问 utf16 属性来获取 String 的 UTF-16 编码。这将返回一个 UTF16View,然后您需要将其转换为一个 Array

import Foundation
import CoreText

extension CTFont {
func glyphs(for string: String) -> [CGGlyph]? {
let utf16 = Array(string.utf16)
var glyphs = [CGGlyph](repeating: 0, count: utf16.count)
guard CTFontGetGlyphsForCharacters(font, utf16, &glyphs, utf16.count) else {
return nil
}
return glyphs
}
}

let font = CTFontCreateWithName("ArialMT" as CFString, 20, nil)
print(font.glyphs(for: "Hello"))

关于ios - CTFontGetGlyphsForCharacters 总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17393076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com