【发布时间】:2016-05-06 01:23:45
【问题描述】:
我在我的 C 应用程序中使用 ISO 8859-1(拉丁扩展 ASCII 字符集)。当我strcpy/strcat 将字符串的各个部分放在一起时,它可以正常工作。但是当我使用sprintf("%s %s") 时,在某些运行时(尤其是某些Android 版本)上,当扩展的ASCII 字符(特别是é,虽然我没有尝试过其他的)被命中时,字符串会被截断。
我认为%s 只是应该复制字节直到'\0' 被命中。我怀疑strcpy/strcat 有效,因为它确实做到了这一点,没有任何格式。这里可能发生了什么?
我应该注意,我不是使用printf() 查看文本,而是我自己的文本渲染引擎,它可以很好地处理 ISO-8859-1。
更新: 澄清一下,我有一个 NDK 应用程序,它将字符串保存在 C 中,并将其传递给我的基于 OpenGL 的文本渲染引擎。如果我将完整的字符串作为 char* 文字传递,它会显示得很好。如果我 sprintf() 将这些部分放在一起,它会在 é 字符处被截断。 例如:
char buffer[1024];
strcpy(buffer, "This is ");
strcat(buffer, "the string I want to diésplay.");
这显示得很好。但是这个:
sprintf(buffer, "%s%s", "This is ", "the string I want to diésplay.");
打印为:
This is the string I want to di
【问题讨论】:
-
你确定这是 sprintf() 的错吗? strlen() 说什么?
-
我不知道,因为我没有遇到此错误的用户的特定 android 设备(众所周知的三星型号)。在我自己的测试设备上运行良好,在 iOS 和 Win32 上也运行良好。所以我想知道某些 Android 运行时上的 sprintf() 是否将 char* 视为 UTF-8 或其他东西。
-
让我澄清一下:你有 NDK 应用程序,它正在将字符串传递给 Java 应用程序?
-
没有。我有一个 NDK 应用程序,它将字符串保存在 C 中,并将其传递给我的基于 OpenGL 的文本渲染引擎。如果我将完整的字符串作为 char* 文字传递,它会显示得很好。如果我 sprintf() 将这些部分放在一起,它会在 é 字符处被截断。例如:字符缓冲区[1024]; strcpy(buffer, "这是"); strcat(buffer, "我想显示的字符串。");这显示得很好。但是这个: sprintf(buffer, "%s%s", "This is ", "the string I want to diésplay.");打印为:This is the string I want to di
-
完全有可能将 UTF-8 编码的字节转换为 C 字符串,但这并不能解释您的用户的观察,因为值
0不会出现在 UTF-8 编码中'\0'以外的任何字符。可能存在编码问题,但我不能说哪种编码会产生您所描述的行为。