gpt4 book ai didi

c - 从指针到 char 返回正确的变音字符?

转载 作者:行者123 更新时间:2023-11-30 15:28:40 25 4
gpt4 key购买 nike

我正在尝试从旧版 FAME 数据库文件中获取正确的角色描述。基本上这是可行的,但是变音符号等打印不正确。基本上,R Package FAME 中包含的以下 C 函数与其说是一个 C 问题,不如说是一个 R 问题。

void fameWhat(int *status, int *dbkey, char **objnam, int *class,
int *type, int *freq, int *basis, int *observ,
int *fyear, int *fprd, int *lyear, int *lprd,
int *obs, int *range,
int * getdoc, char **desPtr, char **docPtr){
/* Get info about an object. Note that range should be an int[3] on input */
int cyear, cmonth, cday, myear, mmonth, mday;
int i;
char fdes[256], fdoc[256];

if(*getdoc){
if(strlen(*desPtr) < 256 || strlen(*docPtr) < 256){
*status = HBNCHR;
return;
}
for(i = 0; i < 255; ++i) fdes[i] = fdoc[i] = ' ';
}
fdes[255] = fdoc[255] = '\0';

cfmwhat(status, *dbkey, *objnam, class, type, freq, basis, observ,
fyear, fprd, lyear, lprd, &cyear, &cmonth, &cday, &myear,
&mmonth, &mday, fdes, fdoc);
if(*getdoc){
strncpy(*desPtr, fdes, 256);
strncpy(*docPtr, fdoc, 256);
}
if(*status == 0 && *class == HSERIE)
cfmsrng(status, *freq, fyear, fprd, lyear, lprd, range, obs);
return;
}

我觉得由于指向描述的指针 desPtr 的指针是 char 类型,因此在调用此函数时我没有得到任何正确的变音符号来自 R 并在 R 控制台中显示结果。我有预感 FAME 是 Latin-1 编码的。 R 是 UTF-8。例如,对于 ä 我得到 \U3e34653c

那么有没有一种方法可以在 C 中完成它并将正确的值传递给 R 或者我应该在 R 中搜索和替换?

注意:我看过这个帖子Using Unicode in C++ source code还有这个How to use utf8 character arrays in c++? .

最佳答案

看来你有一些多重堆叠编码/解码。首先,您是如何“获取”单个字符如此长的 Unicode 值的?

该长代码的原始十六进制到 ASCII 转换为 >4E<<E4> (取决于字节顺序),后者解释为括号内的十六进制值,是 ä您期待的是:http://www.fileformat.info/info/unicode/char/00E4/index.htm ,这是有效的 Latin-1 编码。

从这种编码格式转换为 UTF8 相对简单,尽管我不确定在哪里将此代码粘贴到现有例程中。作为示例独立程序:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
char input[] = "a sm<F6>rg<E5>sbord of <code>";
char *sourceptr, *destptr, *endptr;
int latin1;

sourceptr = input;
destptr = input;
while (*sourceptr)
{
if (*sourceptr == '<')
{
latin1 = strtol (sourceptr+1, &endptr, 16);
if (endptr && *endptr == '>' && latin1 > 127 && latin1 <= 255)
{
/* printf ("we saw hex code %xh\n", latin1); */
/* Quick-and-dirty converting to UTF8: */
*destptr = (char)(0xc0 | ((latin1 & 0xc0) >> 6));
destptr++;
*destptr = (char)(0x80 | (latin1 & 0x3f));
destptr++;
sourceptr = endptr+1;
continue;
}
}
*destptr = *sourceptr;
sourceptr++;
destptr++;
}
*destptr = 0;
printf ("output: %s\n", input);

return 0;
}

这会扫描输入字符串 <后跟一个有效的十六进制代码(假设它是 Latin-1,因此限制为 80..FF)和另一个 > 。找到后,它会插入 UTF8 格式的字符。无法识别的序列将按原样复制。

关于c - 从指针到 char 返回正确的变音字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26501483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com