带UTF-8字符串的UITableView标头?

时间:2013-12-04 18:48:49

标签: ios uitableview

我正在使用Unix%s格式化我的UITableView标头,因为Objective C格式代码%@不处理填充(例如%20 @%20s)。不幸的是,如果我有外来字符的重音,它们就不能正常显示。 “voilà”这个词看起来像这样:

enter image description here

以下是我生成表头的方法:

- (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]
                  ];

2 个答案:

答案 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)

  1. 问题:%s格式化char *,即!= NSString。这样:
  2. 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);        
        }
    }