【问题标题】:How to use English, Russian and Spanish languages in windows console如何在 Windows 控制台中使用英语、俄语和西班牙语
【发布时间】:2017-11-23 09:20:14
【问题描述】:

我试图用谷歌搜索这个问题,但没有找到明确的答案。我正在为自己编写一个程序来练习英语和西班牙语。这很简单,我有我的单词词汇,所以我创建了一个代码,随机选择一个单词,显示在监视器中,第二个“Enter”将显示其他语言的翻译。现在我只做英语->西班牙语。但总的来说,我想做俄罗斯-> 英语加西班牙语。问题是不同的语言无法在 Windows 控制台中正确显示。我需要俄语 cyrylica、西班牙语特殊符号,如 ñ 和单词的英文转录。我用的是NetBeans IDE,它自己的console不能很好的处理scanf函数,所以只能用windows console。 有没有办法做到这一点? 这是代码。我使用随机生成的符号,然后使用附加代码来排除重复的数字。它只是一个原型,原始词汇有几千个单词。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>


#define WORDS 25
void func_words(int rnd);

int main(void) {

    system("COLOR B0");
    srand((time)(NULL));
    char ch;
    int random;
    int count=0;
    int rand_array[1000];
    int MATCH;
    printf("\nPress Enter to continue:");

    while(scanf("%c",&ch)&&ch=='\n')
    {

        for(int i=0;random=rand()%WORDS+1;i++)
        {
            MATCH=0;
            rand_array[i]=random;

            for(int j=0;j<i;j++)
            {

                if(random==rand_array[j])
                    MATCH++;
            }

            if(MATCH!=0)
            continue;
        func_words(random);
        count++;
        printf("\n%i\n",count);
        if(count==WORDS)
            break;
        }

        printf("\nFINISH!\n");

    }



    return 0;
}

void func_words(int rnd)
{
    char ch2;
    char *ar[WORDS][2]={
    {"Costumbre","Habbit, bad habbit"},
    {"Comer", "Eat, Eating, Meal"},
    {"Beber", "Drink, you drink too much"},
    {"Costumbre", "Habit, annoying habit"},
    {"referirse", "Refer"},
    {"el verbo", "Verb"},
    {"Aplicar, emplear", "Apply, We applied to the authorities for assistance. To apply the new method"},
    {"oración", "Sentence, make up a sentence, affirmative sentence"},
    {"piel", "Skin, leather"},
    {"las mejillas", "Cheek"},
    {"bigote", "Moustache, Whisker"},
    {"barba", "beard"},
    {"las pestañas", "eyelash"},
    {" lengua", "language tongue"},
    {"  los órganos internos", "internals "},
    {"lung ", "los pulmones"},
    {"liver  ", "hígado"},
    {"riñones", "Kidney "},
    {"cuello", "neck "},
    {"hueso", "Bones "},
    {"músculo  musculatura", "muscle  "},
    {"nervio", "Nerves "},
    {"nervio", "breathe"},
    {"Reír /  risa", "laugh smile "},
    {"mentón", "chin "},
    {"las cejas", "eyebrow "},

    {"", ""},

    };

        printf("        %s",ar[rnd-1][0]);
        scanf("%c",&ch2);
        printf("\n");
        printf("        %s",ar[rnd-1][1]);
        printf("\n---------------------------\n");
}

【问题讨论】:

    标签: c windows


    【解决方案1】:

    这个问题与字符编码有关:如您所知,计算机使用二进制或一般数字而不是字母。因此,char 只是一种 1 字节整数

    char letter = '0'; // letter contain 48
    

    有几个关于将这些数字映射到字形(字母)的标准,您的控制台必须了解该标准才能正确呈现您的标准输出。

    第一个字符编码标准是 ASCII,不幸的是它只能理解英文字符,然后是拉丁文,以及其他适应大多数欧洲字符集。

    最后,Unicode 被接受,因为它允许世界范围内的大多数字符,包括大约 120000 个代码点。这显然需要每个字符几个字节,这触发了 UTF8、UTF16 等来处理计算机字符串上的 Unicode。


    回答您的问题,显示您需要的复杂字符集:

    1) 将您的文本编码为接受这些字符的标准(例如 UTF8)为此,您可以实施自己的标准,或使用在线提供的众多库之一。

    2) 使用理解 UTF8 的控制台。不确定windows的默认控制台。


    请注意,C 不能确保其中支持特殊字符,因此您的代码中的 ñ 可能会被拒绝。另一种选择是 2 到几个字节的转义序列,例如与目标编码匹配的 '\241'

    【讨论】:

    • “C 中不应包含特殊字符” 不完全正确。 C 标准提到扩展字符集,它允许特殊字符。实际上,编译器通常在 cmets 或字符串文字中支持 基本字符集 之外的字符。
    • 感谢您的精确,我希望我的改写更符合现实。
    • 和 3) 可以显示此类字符的字体。并非所有字体都可以,我认为默认的 Windows 控制台字体不能。关于2)windows控制台可以理解UTF8,但是需要用chcp指定
    • @bolov,控制台对代码页 65001 的实现过于错误——例如即使在 Windows 10 中,由于控制台主机进程 conhost.exe 中的编码错误,它也不允许读取非 ASCII 字符。向控制台读取和写入 Unicode 的唯一可靠方法是通过宽字符控制台 API,例如ReadConsoleWWriteConsoleW。这可以在 C 运行时通过 _setmode(_fileno(stdout), _O_U16TEXT) 启用,然后使用宽字符标准 I/O 函数,例如 wprintf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多