我正在使用Unix%s格式化我的UITableView标头,因为Objective C格式代码%@不处理填充(例如%20 @%20s)。不幸的是,如果我有外来字符的重音,它们就不能正常显示。 “voilà”这个词看起来像这样:
以下是我生成表头的方法:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
...
//NSString *tblHdr = [NSString stringWithFormat:@"%12s", @"voilà"];
NSString *tblHdr = [NSString stringWithFormat:@"%12s", [@"voilà" UTF8String]]; // Fixed example
...
return tblHdr;
}
[更新]
这是我项目的实际代码。我试图在原始示例中保持简单:
tblHdr = [NSString stringWithFormat:@"%-45s%12s%12s%35s",
[NSLocalizedString(@"Quiz Name", @"") UTF8String],
[NSLocalizedString(@"Correct", @"") UTF8String],
[NSLocalizedString(@"Missed", @"") UTF8String],
[NSLocalizedString(@"Score", @"") UTF8String]
];
答案 0 :(得分:3)
似乎%s
格式需要系统编码中的C字符串,
所以这个工作
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(CFStringGetSystemEncoding());
NSString *s = [NSString stringWithFormat:@"%12s", [@"voilá" cStringUsingEncoding:enc]];
(只要字符串可以用系统编码表示)。
否则你可以手动填充字符串:
NSString *t = @"voilá";
if ([t length] < 12) {
t = [[@"" stringByPaddingToLength:(12 - [t length]) withString:@" " startingAtIndex:0] stringByAppendingString:t];
}
(或者使用@ Daij-Djan的方法,这是在我写这篇文章时发布的。)
答案 1 :(得分:1)
NSString *tblHdr = [NSString stringWithFormat:@"%12s", @"voilà".UTF8String];
这不起作用,因为%s似乎没有做多字节的正确IMO!?不确定
我坚持使用NSStrings ...只需手动添加空格
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
//wrong
NSString *tblHdr = [NSString stringWithFormat:@"%12s", @"voilà".UTF8String];
NSLog(@"%@", tblHdr);
//ok
NSMutableString *rawTblHdr = @"voilà".mutableCopy;
while(12-rawTblHdr.length) {
[rawTblHdr insertString:@" " atIndex:0];
}
NSLog(@"%@", rawTblHdr);
}
}