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

Ios 带UTF-8字符串的UITableView标头?,ios,uitableview,Ios,Uitableview,我正在使用Unix%s格式设置UITableView头的格式,因为目标C格式代码%@不处理填充(例如%20@%20s)。不幸的是,如果我有重音的外来字符,它们不会正确显示。“瞧”一词是这样出现的: 以下是生成表格标题的方法: - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { ... //NSString *tblHdr = [NSStrin

我正在使用Unix%s格式设置UITableView头的格式,因为目标C格式代码%@不处理填充(例如%20@%20s)。不幸的是,如果我有重音的外来字符,它们不会正确显示。“瞧”一词是这样出现的:

以下是生成表格标题的方法:

- (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]
                  ];
  • 问题:%s格式化一个字符*,它是!=NSString。因此:
  • NSString*tblHdr=[NSString stringWithFormat:@“%12s”,@“voilá”.UTF8String]

    这不起作用,因为%s在我看来没有多字节权限!?不确定

    我会坚持下去。。。只需手动添加空格

    #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);        
        }
    }
    
    #导入
    int main(int argc,char*argv[]){
    @自动释放池{
    //错
    NSString*tblHdr=[NSString stringWithFormat:@“%12s”,@“voilá”.UTF8String];
    NSLog(@“%@”,tblHdr);
    //嗯
    NSMutableString*rawTblHdr=@“瞧”。mutableCopy;
    而(12个图纸长度){
    [rawTblHdr insertString:@“atIndex:0];
    }
    NSLog(@“%@”,rawTblHdr);
    }
    }
    
  • 问题:%s格式化一个字符*,它是!=NSString。因此:
  • NSString*tblHdr=[NSString stringWithFormat:@“%12s”,@“voilá”.UTF8String]

    这不起作用,因为%s在我看来没有多字节权限!?不确定

    我会坚持下去。。。只需手动添加空格

    #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);        
        }
    }
    
    #导入
    int main(int argc,char*argv[]){
    @自动释放池{
    //错
    NSString*tblHdr=[NSString stringWithFormat:@“%12s”,@“voilá”.UTF8String];
    NSLog(@“%@”,tblHdr);
    //嗯
    NSMutableString*rawTblHdr=@“瞧”。mutableCopy;
    而(12个图纸长度){
    [rawTblHdr insertString:@“atIndex:0];
    }
    NSLog(@“%@”,rawTblHdr);
    }
    }
    
    似乎
    %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];
    }
    
    NSString*t=@“瞧”;
    如果([t长度]<12){
    t=[[@“stringByPaddingToLength:(12-[t length]),带有字符串:@“startingAtIndex:0]stringByAppendingString:t];
    }
    

    (或者使用@Daij Djan的方法,这是我写这篇文章时发布的)。

    似乎
    %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];
    }
    
    NSString*t=@“瞧”;
    如果([t长度]<12){
    t=[[@“stringByPaddingToLength:(12-[t length]),带有字符串:@“startingAtIndex:0]stringByAppendingString:t];
    }
    

    (或者使用@Daij Djan的方法,这是我写这篇文章时发布的)。

    以下是我真正的项目的样子:“%-45s%12s%12s%35s”。使用实空间是痛苦的。然后按照martin的建议,调用一个不推荐的方法:(sorry@Daij-Djan:不推荐使用的方法已被替换。啊,太酷了。我只尝试了使用UTF8编码的cStringUsingEncoding,这是毫无意义的。很好!这是我真正的项目的样子@“%-45s%12s%12s%35s”。使用实空间是痛苦的。然后按照martin的建议,调用一种不推荐的方法:( sorry@Daij-Djan:不推荐的方法已经被取代了。啊,酷。我只尝试了cStringUsingEncoding和UTF8编码,这是毫无意义的。很好!stringByPaddingToLength看起来比我的原始循环更适合stringByPaddingToLength看起来比我的原始循环更适合