Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UTF-8->;C语言中的ASCII_C_Utf 8_Ascii - Fatal编程技术网

UTF-8->;C语言中的ASCII

UTF-8->;C语言中的ASCII,c,utf-8,ascii,C,Utf 8,Ascii,我有一个在互联网上找不到的简单问题,如何在C语言中仅使用标准库将UTF-8转换为ASCII(大多数重音字符转换为没有重音的相同字符)?我找到了大多数语言的解决方案,但不是特别针对C语言 谢谢 编辑:一些评论的好心人让我反复检查我需要什么,我夸大了。我只需要一个如何制作一个函数的想法:char with accent->char without accent.:) 这样做没有内在的方法。UTF-8和ASCII之间几乎没有区别,除非您讨论的是高级字符,而高级字符无论如何都不能用ASCII表示 如果您

我有一个在互联网上找不到的简单问题,如何在C语言中仅使用标准库将UTF-8转换为ASCII(大多数重音字符转换为没有重音的相同字符)?我找到了大多数语言的解决方案,但不是特别针对C语言

谢谢


编辑:一些评论的好心人让我反复检查我需要什么,我夸大了。我只需要一个如何制作一个函数的想法:char with accent->char without accent.:)

这样做没有内在的方法。UTF-8和ASCII之间几乎没有区别,除非您讨论的是高级字符,而高级字符无论如何都不能用ASCII表示


如果您有一个您想要的特定映射(例如带有重音->a的a),那么您可能应该将其作为字符串替换操作来处理。

看一看。即使你坚持在没有图书馆的情况下做这件事,你可能会在那里找到灵感。

一般来说,你不能。UTF-8的覆盖范围远不止重音字符

每个像样的Unicode支持库(当然不是标准库)都有一种将字符串分解为KC或KD形式的方法。把变音符号和字母分开。让你有机会过滤掉它们。不太确定这是否值得追求,结果对母语读者来说只是胡言乱语,而且不是每个字母都是可分解的。换句话说,是带问号的垃圾。

既然这是家庭作业,我猜你的老师毫无头绪,对UTF-8一无所知,可能在20世纪80年代还停留在“代码页”和“扩展ASCII”(如果你还没有从词汇表中删除单词)上。您的老师可能希望您编写一个128字节的查找表,将128-255范围内的CP437或Windows-1252字节映射为类似的ASCII字母。会有点像

void strip_accents(unsigned char *dest, const unsigned char *src)
{
    static const unsigned char lut[128] = { /* mapping here */ };
    do {
        *dest++ = *src < 128 ? *src : lut[*src];
    } while (*src++);
 }
void strip\u重音符号(unsigned char*dest,const unsigned char*src)
{
static const unsigned char lut[128]={/*此处映射*/};
做{
*dest++=*src<128?*src:lut[*src];
}而(*src++);
}

它不在标准库中,因此您应该指定真正需要它的平台。@dccarmo-C标准不是例如Posix标准。Linux上的可用性,甚至Posix的强制要求,都不能使其成为C标准库。那么,这是否意味着要求“C标准库”是相对的,可以接受解释?@dccarmo-如果你的意思是“一种由C编写的可用语言,它是由C标准以外的一些标准强制要求的”,我认为“C标准库”这是一个非常糟糕的表达方式。我可以原谅在大多数事情上粗心/混乱的措辞,但这是C对Posix的事情,是个人的宠物愤怒。决定你在与那些在互联网上犯错误的人的战争中的特殊角色是很重要的——这是我的;-)在你提到Posix之前我都不知道。如果我不知道自己到底在为什么而战,我就不能站在哪一边,但无论如何,我为我的错误道歉。:)我认为这违反了“仅使用标准库”@Billy-如果只有一个人读取libiconv源代码(例如,复制代码范围),那么就不会这样。但是当我尝试执行if(c='a'){c='a';}时,它会给我“由于数据类型范围有限,比较总是错误的”:(@dccarmo:
'á'
对于C来说就像
'\0703\0120'
,所以这是一个大于
char
所能容纳的常量,所以如果
C
是一个char,它就永远无法与之相等。它很可能等于
'\0703'
,流中的下一个字符就是
'\0120'
@nategoose:删除前导零;它们在C八进制字符转义中无效。
\0703\0120
被解析为
\070
3
\012
0
。不确定它是否为标准C,但您可以使用宽字符文本,如
L'á
@R:您是对的,但我无法编辑注释。I不要经常使用八进制,所以我把它搞砸了。是的,我夸大了我的问题。我真的只想转换重音字符->没有重音的字符。我恨我的老师只允许我们用标准库和C来做这件事。如果我能用Python就好了(