0

我想使用 NSString 编写 vsnprintf 函数。

这是我的 vsnprintf 实现:

int my_vsnprintf(char *buffer, size_t count, const char *format, ...)
{
    int iRet;
    va_list ap;
    NSString *pnssBuffer=NULL;
    NSString *pnssFormat;
    const char *pcszBuffer;
    /* Format with NSString */
    pnssFormat=[NSString stringWithCString:format 
    encoding:NSUTF8StringEncoding];
    va_start(ap, format);
    pnssBuffer=[[NSString alloc] initWithFormat:pnssFormat arguments:ap];
    /* Copy to char * */
    pcszBuffer=[pnssBuffer cStringUsingEncoding:NSUTF8StringEncoding];
    memcpy(buffer, pcszBuffer, count);
    iRet=strlen(buffer);
    /* Free */
    [pnssBuffer release];
    va_end(ap);
    return iRet;
}

当我用char *参数调用它时,它可以工作:

    my_vsnprintf(buffer, 256, "hello %s", "world");
NSLog(@"buffer = %s", buffer);

正确打印:buffer = hello world

但是当我用wchar_t *参数调用它时,我只得到世界的第一个字符

    my_vsnprintf(buffer, 256, "hello %ls", L"world");
NSLog(@"buffer = %s", buffer);

打印这个:缓冲区=你好w

我不明白为什么,对我的功能有什么帮助吗?

4

1 回答 1

1

根据《String Programming Guide》中的String Format SpecifiersinitWithFormat:arguments: ,朋友们不支持“%ls”格式。实际上,这里忽略了“l”修饰符。

有一种“%S”格式,但它是针对 16 位 Unicode 字符序列的,因此您不能将其用于wchar_t任何一种。

添加

wchar_t在 iPhone 和 Simulator 上是 4 字节的 Unicode(小端),因此您可以将其转换NSString为如下:

wchar_t *w = L"Hello world";
NSString *str = [[NSString alloc] initWithBytes:w length:4*wcslen(w)
    encoding:NSUTF32LittleEndianStringEncoding];
于 2012-08-17T19:38:14.793 回答