【问题标题】:C string special character (Portuguese)C 字符串特殊字符(葡萄牙语)
【发布时间】:2018-09-18 18:06:47
【问题描述】:

如何正确处理特殊的葡萄牙语字符,例如:ç、é、è 等等...在 C 中使用字符串?

我找到了如何使用 printf 但 scanf、fgets 等...我现在不知道如何在字符串上正确存储这种字符...

#include <locale.h>

int main (void){
  setlocale(LC_ALL,"Portuguese");

  printf("This is a example! Portuguese caracters ç é");

}

编辑:

按照以下建议尝试了此代码:

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


int main() {
    int a = 0;
    setlocale(LC_ALL,"Portuguese");

    wprintf(L"Exemplo de ç\n");

    return 0;
}

从控制台手动编译: gcc -o main.exe main.c 有效。 但是使用 devc++ 给我一个错误:

[错误] 转换为执行字符集:无效参数

如果我只输入: wprintf(L"Exemplo de\n"); (没有ç)devc++ 现在编译良好。

所以一旦手动编译它,我猜是与 devc++ 编译选项有关的东西......有人知道吗?

EDIT2:

我所有这些的主要目标是询问用户输入。读取该输入以保存到文件。每次程序启动时,我都会读取文件以恢复保存在文件中的值。

但在葡萄牙语中,用户可以输入诸如ç、é、è ...

【问题讨论】:

  • 正如你所说的`printf 等工作。他们在 C 中使用所谓的“字符串”,所以不清楚你的问题是什么。阅读How to Ask 并遵循建议。
  • 您使用 wide 输入和输出,以及宽字符串。而不是强制某些语言环境,而是告诉 C 库使用用户当前的语言环境。例如,请参阅我为this answer 编写的示例程序。
  • 你可以使用宽字符,但使用普通字符和 UTF-8 更容易,至少对葡萄牙语来说是这样。

标签: c string scanf fgets


【解决方案1】:

您可以像其他人一样使用 locale.h。但是如果你想节省一些存储空间或者让你的代码运行得更快,你可以使用字符的 ASCII 含义。一个例子:

#include <stdio.h>
int main()
{
    printf("Oo! Special character: %c",141);
    return 0;
}

【讨论】:

    【解决方案2】:

    如果您在 linux 或 OS/X 上工作,只需在源文件和终端中使用 UTF-8 编码即可无缝工作。

    有了这么简单的源码:

    #include <stdio.h>
    
    int main() {
        printf("Olá! vocês todos moram na França?\n");
        return 0;
    }
    

    我得到这个输出:Olá! vocês todos moram na França?

    十六进制和八进制:

    0000 4F 6C C3 A1 21 20 76 6F 哦 \303 \241 ! VO 0008 63 C3 AA 73 20 74 6F 64 c \303 \252 秒 0020 6F 73 20 6D 6F 72 61 6D o s m o r a m 0028 20 6E 61 20 46 72 61 6E n a r a n 0040 C3 A7 61 3F 0A \303 \247 一个? \n

    如您所见,á 编码为\xC3\xA1ê 编码为\xC3\xAAç 编码为\xC3\xA7

    【讨论】:

      【解决方案3】:

      如何正确处理特殊的葡萄牙语字符,例如:ç、é、è 等等...在 C 中使用字符串?

      将语言环境设置为使用 utf8 并使用 u8 前缀形成字符串文字。

      #include <stdio.h>
      #include <locale.h>
      int main (void) {
        if (setlocale(LC_ALL, "en_US.utf8")) {
          puts("Unable to set locale");
        } else {
          puts(u8"This is a example! Portuguese characters ç é");
        }
      }
      

      输出

      This is a example! Portuguese characters ç é
      

      使用wprintf() 的一个问题是所有输出都应该是w....()。一旦代码使用printf()wprintf(),流现在就有了一个方向

      字节输入/输出函数不应应用于面向宽的流,宽字符输入/输出函数不应应用于面向字节的流。 C17dr § 7.21.2 4

      【讨论】:

        【解决方案4】:

        注意:

        setlocale(LC_ALL,"Portuguese");
        

        适用于终端输出(例如 printf)

        如果您对使用特殊字符(例如葡萄牙语)从磁盘读取文件感兴趣, 特别是如果您使用的是 WINDOWS 和 DOS 文件(Windows/DOS 中的文本文件), 您应该以 ANSI 编码编写文件。

        如何以ANSI编码保存文本文件?

        使用具有“enconding”菜单选项的“Notepad++”(https://notepad-plus-plus.org/) 允许以 ANSI 编码选择和保存文件。

        【讨论】:

        • 这是错误的。 ANSI 代码页实际上从来都不是正确的答案。 UTF-8 无处不在,但 Window 对它的支持充其量是不稳定的。
        • 您可以说使用 UTF-8 比使用 ANSI 更好(我同意)...但是,我的 cmets 与 Windows/DOS 用户以及他们在特殊字符、打印和从文件中读取文本。没错,它适用于 GCC(MinGW 和 CodeBloks 17,很多人都在使用它!)。如果你有问题,就解决它。
        【解决方案5】:
        #include <iostream>
        #include <locale>
        using std::string;
        using std::cout;
        int main()
        {
            setlocale(LC_ALL, "pt_BR.UTF-8");
            cout << "Agora pode usar : á é í ó ú à è ì ò ù ã õ â ê î ô û ç";
            cout << "Agora pode usar : Á É Í Ó Ú À È Ì Ò Ù Ã Õ Â Ê Î Ô Û Ç";
        }
        

        screenshot

        【讨论】:

        • 请添加解释(英文)该答案如何解决 OP 的问题。
        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案6】:

        对本地字符使用宽字符串。以下对我有用:

        #include <wchar.h>
        #include <locale.h>
        int main (void)
        {
           setlocale(LC_ALL,"pl_PL.UTF-8");
           wprintf(L"This is a example! Polish characters ąśćłźó\n");
        }
        

        【讨论】:

        • 如果我手动编译它可以工作......但是用 devc++ 编译会给我一个错误。您使用哪种 IDE 和编译器?
        • ArchLinux,IDE - vim,gcc 7.3.1 20180312。我不使用 devc++ 作为 mu ide,所以我无能为力。也许按照这里的建议使用 -std=c99:*.com/questions/17584856/…
        • 你用什么作为ide来编译gcc?你只是用 vim 作为编辑器?
        • 我用的是linux。对于小程序,我在 vim 中编辑并从命令行运行 gcc 编译器(无 ide)。对于大型项目,我使用 eclipse(和/或 qt-creator,如果我需要创建 gui)作为 IDE,cmake 作为 makefile 生成器,我使用 cmake+gcc 或 clang 设置批处理编译,所以我可以使用 travis 或 gitlab-ci或 docker-hub 来自动化测试和/或部署。对于 windows devc++ 是一个不错的选择,我曾经使用过 CodeBlocks,对于大型项目,我可能会在 windows 上使用 eclipse+mingw,因为我更习惯 eclipse,但这只是我,而且设置起来更加困难。
        最近更新 更多