GVKun编程网logo

MinGW“程序入口点libintl_setlocale找不到…”(mingw安装后找不到程序)

7

如果您对MinGW“程序入口点libintl_setlocale找不到…”和mingw安装后找不到程序感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解MinGW“程序入口点libintl_set

如果您对MinGW“程序入口点libintl_setlocale找不到…”mingw安装后找不到程序感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解MinGW“程序入口点libintl_setlocale找不到…”的各种细节,并对mingw安装后找不到程序进行深入的分析,此外还有关于-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory、/bin/bash: 警告: setlocale: LC_ALL: 无法更改区域设置 (en_US.UTF-8)、c – 使用MinGW / MSYS和CMake对`libintl_gettext’进行未定义的引用、C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方...的实用技巧。

本文目录一览:

MinGW“程序入口点libintl_setlocale找不到…”(mingw安装后找不到程序)

MinGW“程序入口点libintl_setlocale找不到…”(mingw安装后找不到程序)

我在Windows 7 64位下build立一个项目有问题。 我已经看过类似的问题,但没有find适当的解决办法。 当我运行:

cmake -v -G "MSYS Makefiles" CMakeLists.txt

它给了我以下输出:

> -- The C compiler identification is unkNown -- Check for working C compiler: c:/MinGW/bin/gcc.exe -- Check for working C compiler: c:/MinGW/bin/gcc.exe -- broken CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.0/Modules/CMakeTestCCo mpiler.cmake:61 (message): The C compiler "c:/MinGW/bin/gcc.exe" is not able to compile a simple test program. It fails with the following output: Change Dir: C:/Users/Sony/Documents/Computer_Graphics/assignment_01/programmi ng/glfw/CMakeFiles/CMakeTmp Run Build Command:"C:/MinGW/msys/1.0/bin/make.exe" "cmTryCompileExec1735268707/fast" /usr/bin/make -f CMakeFiles/cmTryCompileExec1735268707.dir/build.make CMakeFiles/cmTryCompileExec1735268707.dir/build make[1]: Entering directory `/c/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMak eFiles/CMakeTmp'' "/C/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_progress_report /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMake Files/CMakeTmp/CMakeFiles 1 Building C object CMakeFiles/cmTryCompileExec1735268707.dir/testCCompiler.c.obj /c/MinGW/bin/gcc.exe -o CMakeFiles/cmTryCompileExec1735268707.dir/testCCompiler.c.obj -c /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMake Files/CMakeTmp/testCCompiler.c make[1]: *** [CMakeFiles/cmTryCompileExec1735268707.dir/testCCompiler.c.obj] Error 1 make[1]: Leaving directory

在编译期间,我也得到了下一个错误消息3次,它说:“程序入口点libintl_setlocale不能位于库libintl-8.dll中”

CMakeError.log:

在Unix上分离命令行输出(处理和用户交互)的方法是什么?

C#更改非Unicode语言或更改位置

如何在运行时创build和插入HTML?

只有在可inheritance的集合中才有能力是什么意思?

数据结构来存储数十亿整数

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-c

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-Aa

输出是:1:0:1:错误:缺less''(''谓词后

使用“”检查C编译器是否为IAR与“IAR。+编译器”不匹配:gcc.exe:致命错误:没有input文件编译终止。 通过以下输出确定C编译器是否工作失败:更改目录:C:/ Users / Sony / Documents / Computer_Graphics / assignment_01 / programming / glfw / CMakeFiles / CMakeTmp

运行构build命令:“C:/MinGW/msys/1.0/bin/make.exe”“cmTryCompileExec2453403923 / fast”/ usr / bin / make -f CMakeFiles / cmTryCompileExec2453403923.dir / build.make CMakeFiles / cmTryCompileExec2453403923.dir / build make [1]:进入目录/c/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp'' "/c/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_progress_report /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp/CMakeFiles 1 Building C object CMakeFiles/cmTryCompileExec2453403923.dir/testCCompiler.c.obj /c/MinGW/bin/gcc.exe -o CMakeFiles/cmTryCompileExec2453403923.dir/testCCompiler.c.obj -c /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp/testCCompiler.c make[1]: Leaving directory / c / Users / Sony / Documents / 错误1 make:* [cmTryCom / CMakeFiles / CMakeTmp'' pileExec2453403923 / fast]错误2

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-c

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-Aa

输出是:1:0:1:错误:缺less''(''谓词后

使用“”检查C编译器是否为IAR与“IAR。+编译器”不匹配:gcc.exe:致命错误:没有input文件编译终止。 确定C编译器是否工作失败并显示以下输出:更改目录:C:/ Users / Sony / Documents / Computer_Graphics / assignment_01 / programming / glfw / CMakeFiles / CMakeTmp

运行构build命令:“C:/MinGW/msys/1.0/bin/make.exe”“cmTryCompileExec78678067 / fast”/ usr / bin / make -f CMakeFiles / cmTryCompileExec78678067.dir / build.make CMakeFiles / cmTryCompileExec78678067.dir / build make [1]:进入目录/c/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp'' "/C/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_progress_report /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp/CMakeFiles 1 Building C object CMakeFiles/cmTryCompileExec78678067.dir/testCCompiler.c.obj /c/MinGW/bin/gcc.exe -o CMakeFiles/cmTryCompileExec78678067.dir/testCCompiler.c.obj -c /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp/testCCompiler.c make[1]: make[1]: Leaving directory / c / Users / Sony / Documents / Computer_Graphics / assignment_01 / programming / glfw / CMakeFiles / CMakeTmp'' * [CMakeFiles / cmTryCompileExec78678067.dir / testCCompiler.c.obj]错误1 make:* [cmTryCompileExec7867 8067 /快]错误2

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-c

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-Aa

输出是:1:0:1:错误:缺less''(''谓词后

使用“”检查C编译器是否为IAR与“IAR。+编译器”不匹配:gcc.exe:致命错误:没有input文件编译终止。 确定C编译器是否工作失败并显示以下输出:更改目录:C:/ Users / Sony / Documents / Computer_Graphics / assignment_01 / programming / glfw / CMakeFiles / CMakeTmp

运行构build命令:“C:/MinGW/msys/1.0/bin/make.exe”“cmTryCompileExec1735268707 / fast”/ usr / bin / make -f CMakeFiles / cmTryCompileExec1735268707.dir / build.make CMakeFiles / cmTryCompileExec1735268707.dir / build make [1]:进入目录/c/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp'' "/C/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_progress_report /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp/CMakeFiles 1 Building C object CMakeFiles/cmTryCompileExec1735268707.dir/testCCompiler.c.obj /c/MinGW/bin/gcc.exe -o CMakeFiles/cmTryCompileExec1735268707.dir/testCCompiler.c.obj -c /C/Users/Sony/Documents/Computer_Graphics/assignment_01/programming/glfw/CMakeFiles/CMakeTmp/testCCompiler.c make[1]: *** [CMakeFiles/cmTryCompileExec1735268707.dir/testCCompiler.c.obj] Error 1 make[1]: Leaving directory / c / Users / Sony / Documents / Computer_Graphics / assignment_01 / programming / glfw / CMakeFiles / CMakeTmp''make:*** [cmTr yCompileExec1735268707 / fast]错误2

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:

输出结果是:1

编译C编译器标识源文件“CMakeCCompilerId.c”失败。 编译器:c:/MinGW/bin/gcc.exe生成标志:Id标志:-c

输出结果是:1

另外我的path环境variables:

C:Program Files(x86) PC Connectivity Solution ; C: Program Files Common Files Microsoft Shared Windows Live; C: Program Files(x86) Common Files Microsoft Shared Windows Live; c: Program Files(x86) Intel iCLS Client ; c: Program Files Intel iCLS Client ; C: Program Files(x86) AMD APP bin x86_64; C: Program Files(x86) AMD APP bin x86;%SystemRoot% system32;%SystemRoot%;%SystemRoot% System32 Wbem;%SYstemROOT% System32 WindowsPowerShell v1.0 ; C: Program Files(x86) ATI Technologies ATI .ACE Core-Static; C: Program Files Intel Intel(R)Management Engine Components DAL; C: Program Files Intel Intel(R)Management Engine Components IPT; C: Program Files(x86 ) Intel Intel(R)Management Engine Components DAL; C: Program Files(x86) Intel Intel(R)Management Engine Components IPT; C: Program Files Sony VAIO Improvement ; C: Program Files(x86) Sony VAIO启动设置工具; C: Program Files(x86) Windows Live Shared; c: Program Files(x86) Microsoft sql Server 100 Tools Binn ; c: Program Files Microsoft SQ L Server 100 Tools Binn ; c: Program Files Microsoft sql Server 100 DTS Binn ; C: Program Files(x86) MVActiveX ; C: Java jdk1.7.0_09 bin ; C: Program Files Microsoft Web Platform Installer ; C: Program Files(x86) Microsoft ASP.NET ASP.NET Web Pages v1.0 ; C: Program Files(x86) Windows Kits 8.0 Windows性能工具包; C: Program Files Microsoft sql Server 110 Tools Binn ; C: Program Files TortoiseHg ; C: Program Files MATLAB R2013a runtime win64; C: Program Files MATLAB R2013a bin; C: MinGW bin; C: Program Files(x86) CMake bin

我安装并重新安装了mingw并调查了我的pathvariables,但仍然没有解决办法。 任何想法,我错了?

检查文件是否存在,包括PATH

改变在C#中编写Windows的语言

debugging – 是否有Windowsdebugging器的检查点function?

识别C和C ++函数之间的逻辑相似性的工具

为什么我不能在gdb中打印出环境variables?

我刚刚找到了答案:我的路径中有另一个libintl-8.dll。

从命令行执行此操作:

where libintl-8.dll

然后重命名除MinGW树中的所有这些之外的所有它们。

如果失败,则可能需要重新安装MinGW树。 祝你好运。

删除System32 / SysWOW64中的libintl-8.dll,它应该可以正常工作。

这是一个有点无知的猜测,但是libintl-8.dll的问题可能是由路径问题引起的。 在你的路径的某个地方,你可以拥有不同入口点的老版本的lib。 确保你有最新版本的MinGW和所有相关的库,然后尝试将MinGW bin移动到路径变量的顶部。

有关此问题的另一个示例,请参见: MinGW“无法找到过程入口点libiconv …”

这个问题的答案帮助我解决了我遇到的类似问题。

总结

以上是小编为你收集整理的MinGW“程序入口点libintl_setlocale找不到…”全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

mac 连接 centos 服务器时报警告:

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

原因是 ssh连接的时候会传递环境变量,这个变量如在服务器没有本地的环境,就会报这个错误,其实就是$LC_CTYPE 这个环境变量导致的。

LC_CTYPE这个参数,mac上面是UTF-8,服务器上面缺少相应配置,识别不了。

处理方法:
在centos服务器上

v /etc/localeconf

修改为

LC_ALL=en_US.utf8
LC_CTYPE=en_US.utf8
LANG=en_US.utf8
  •  

重新连接,警报消除

 

/bin/bash: 警告: setlocale: LC_ALL: 无法更改区域设置 (en_US.UTF-8)

/bin/bash: 警告: setlocale: LC_ALL: 无法更改区域设置 (en_US.UTF-8)

$ sudo apt install locales
$ sudo locale-gen en_US.UTF-8
$ sudo dpkg-reconfigure locales

在最后一步中,您将看到一个基于文本的 UI,通过使用向上和向下箭头移动并通过空格键选择或输入其 ID(即 159)来选择 en_US.UTF-8

c – 使用MinGW / MSYS和CMake对`libintl_gettext’进行未定义的引用

c – 使用MinGW / MSYS和CMake对`libintl_gettext’进行未定义的引用

我正在尝试将gettext添加到C项目中.它在 Linux下编译并运行良好,但是在Windows 7 64位中我得到了MinGW32的链接器错误.我正在使用cmake -G“MSYS Makefiles”进行编译..因为MinGW不适用于模糊的原因.我也试过忍者.

在CMakeLists.txt中,我有

find_package(Gettext required
include_directories(${GETTEXT_INCLUDE_DIR})
if (INTL_FOUND)
    find_package(INTL required)
    include_directories(${INTL_INCLUDE_DIR})
endif()

发现的是

GETTEXT_INCLUDE_DIR = C:/MinGW/msys/1.0/local/include

该项目正在编译没有问题,但在链接阶段,我得到以下错误:

<source file location> undefined reference to `libintl_gettext'
<source file location> undefined reference to `libintl_setlocale'
<source file location> undefined reference to `libintl_textdomain'

等等

我看了一眼https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined

并将以下内容添加到CMakeLists.txt:

SET(GCC_COVERAGE_COMPILE_FLAGS "-s -O2 -lintl")
SET(GCC_COVERAGE_LINK_FLAGS    "-lintl")
SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS}

然后我试了

SET(GCC_COVERAGE_COMPILE_FLAGS "-s -O2 -lintl -liconv -LC:/MinGW/msys/1.0/local/lib -IC:/MinGW/msys/1.0/local/include")
SET(GCC_COVERAGE_LINK_FLAGS    "-lintl -liconv -LC:/MinGW/msys/1.0/local/lib -IC:/MinGW/msys/1.0/local/include")

这也没用.

解决方法

我正在使用Win-builds,我遇到了类似的问题.
我只是尝试使用gettext构建Hello World程序.

根据我的理解,这应该有效,但不是:

gcc -lintl.dll -D__USE_MINGW_ANSI_STdio -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe testGettex.c

输出是:

C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x1a): undefined reference to `libintl_setlocale'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x2b): undefined reference to `libintl_setlocale'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x3e): undefined reference to `libintl_bindtextdomain'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x4a): undefined reference to `libintl_textdomain'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x56): undefined reference to `libintl_gettext'
C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o:testGettex.c:(.text+0x5e): undefined reference to `__printf__'
d:/prog/win-builds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Julien\AppData\Local\Temp\ccAvCaR2.o: bad reloc address 0x0 in section `.pdata'
d:/prog/win-builds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: final link Failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

所以我尝试使用.dll直接链接而不是使用.dll.a,我可以用这个命令构建:

gcc -D__USE_MINGW_ANSI_STdio -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe D:\Prog\Win-builds\bin\libintl-8.dll testGettex.c

但是,我不知道你怎么告诉CMake直接链接到.dll …也许最好的办法是找到MinGW的bug跟踪器并用文件libintl.dll.a解释它们的问题.

编辑:我刚刚阅读了你给出的链接,我看到了另一个也工作的解决方案,将两个-l选项移动到命令的末尾

gcc -D__USE_MINGW_ANSI_STdio -Wall -Wextra -Werror -std=gnu99 -o testGettex.exe testGettex.c -lintl.dll -liconv

也许有办法告诉CMake在行尾移动这两个选项.

C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方...

C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方...

转自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/ 

[在此向原文作者说声谢谢!若有读者看到文章转载时请写该转载地址,不要写我的BLOG地址。尊重他人的劳动成果 ^_^ ]

C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法。这篇是我自己的 setlocale() 使用总结。

Linux的glibc中的setlocale()

具体参考:man 3 setlocale

头文件与声明如下:

1 #include <locale.h>
2 charsetlocale(int category, const char* locale);

说明

category:为locale分类,表达一种locale的领域方面,通常有下面这些预定义常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,其中 LC_ALL 表示所有其它locale分类的并集。

locale:为期望设定的locale名称字符串,在Linux/Unix环境下,通常以下面格式表示locale名称:language[_territory][.codeset][@modifier],language 为 ISO 639 中规定的语言代码,territory 为 ISO 3166 中规定的国家/地区代码,codeset 为字符集名称。

在Linux下,可以使用 locale -a 命令查看系统中所有已配置的 locale。用不带选项的 locale 命令查看当前 Shell 中活动的 locale。用 locale -m 命令查看locale系统支持的所有可用的字符集编码。

和locale相关的包叫做:locales,locale系统支持的所有可用locale在文件:/usr/share/i18n/SUPPORTED 中列出。

在Debian下,可用 dpkg-reconfigure locales 命令重新配置 locale,也可以手工修改 /etc/locale.gen 文件,然后运行 locale-gen 命令。

在Ubuntu下,修改 /var/lib/locales/supported.d/local 文件,配置新的 locale,然后运行 locale-gen 命令。

当 locale 为 NULL 时,函数只做取回当前 locale 操作,通过返回值传出,并不改变当前 locale。

当 locale 为 "" 时,根据环境的设置来设定 locale,检测顺序是:环境变量 LC_ALL,每个单独的locale分类LC_*,最后是 LANG 变量。为了使程序可以根据环境来改变活动 locale,一般都在程序的初始化阶段加入下面代码:setlocale(LC_ALL, "")。

当C语言程序初始化时(刚进入到 main() 时),locale 被初始化为默认的 C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,是用来书写C语言源程序的最小字符集(所以才起locale名叫:C)。

当用 setlocale() 设置活动 locale 时,如果成功,会返回当前活动 locale 的全名称;如果失败,会返回 NULL。

Windows的CRT中的setlocale()

具体参考:setlocale - MSDN Run-Time Library Reference

在 Windows CRT 的实现中还有一个使用 wchar_t 作为 locale 名的宽字符版本:_wsetlocale()。因此,也有了使用 _TCHAR 宏版本的 setlocale():_tsetlocale()

Windows CRT 实现的 setlocale() 和 glibc 版本的头文件与声明相同,使用方法类似,如下:

支持的 locale 分类常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MONETARY、LC_NUMERIC、LC_TIME。

请求设定的 locale 名可以为以下格式(参考MSDN:Language and Country/Region Strings):

  1. lang[_country_region[.code_page]]:虽然形式与 glibc 的相同,当 Windows 的 locale 名并不符合 POSIX 的规范,比如采用 GBK 字符集的大陆中文,POSIX 的名字为:zh_CN.GBK,而在 Windows CRT 中要用:Chinese_People''s Republic of China.936,(-_-^)。

    • lang 字段的可用值参考:Language Strings

    • country_region 字段的可用值参考:Country/Region Strings

    • code_page 字段的可用值是 Windows 系统支持的代码页编号,参考:Code Page Identifiers

  2. .code_page:可以直接使用代码页来设定 locale,而且可以使用 .OCP、.ACP 两个伪代码页,.OCP 表示从系统获得的当前活动的 OEM 代码页,.ACP 表示从系统获得的活动 ANSI 代码页。

  3. "":根据 Windows 系统环境的活动 ANSI 代码页来设定 locale。.OCP、.ACP、和环境代码页都受控制面板中“区域与语言选项”的设置影响。默认装完简体中文版 Windows 后,活动的 ANSI 代码页为:936(即 GBK),可用 chcp 控制台程序查看活动代码页。

  4. NULL:取回当前 locale,不改变当前 locale。

setlocale()的作用和使用例子

当向终端、控制台输出 wchar_t 类型的字符时,需要设置 setlocale(),因为通常终端、控制台环境自身是不支持 UCS 系列的字符集编码的,使用流操作函数时(如:printf()),在标准/RT库实现的内部会将 UCS 字符转换成合适的本地 ANSI 编码字符,转换的依据就是 setlocale() 设定的活动 locale,最后将结果字符序列传递给终端,对于来自终端的输入流这个过程刚好相反。

可以用重定向输出流到文件的方法验证上面的机制:无论是 Windows CRT、Linux glibc、Cygwin glibc,使用 wprintf() 打印 wchar_t 字符文本时,重定向到文件的内容总是 GBK、UTF-8 等本地 ANSI 编码,而不会是 UCS 编码。

下面是我写的一个使用 setlocale() 的示例:

01 #ifdef __GNUC__
02   
03 #define CSET_GBK    "GBK"
04 #define CSET_UTF8   "UTF-8"
05   
06 #define LC_NAME_zh_CN   "zh_CN"
07   
08 // ifdef __GNUC__
09 #elif defined(_MSC_VER)
10   
11 #define CSET_GBK    "936"
12 #define CSET_UTF8   "65001"
13   
14 #define LC_NAME_zh_CN   "Chinese_People''s Republic of China"
15   
16 // ifdef _MSC_VER
17 #endif
18   
19 #define LC_NAME_zh_CN_GBK       LC_NAME_zh_CN "." CSET_GBK
20 #define LC_NAME_zh_CN_UTF8      LC_NAME_zh_CN "." CSET_UTF8
21 #define LC_NAME_zh_CN_DEFAULT   LC_NAME_zh_CN_GBK
22   
23 void print_current_loc();
24   
25 int main(int argc, char* argv[])
26 {
27     char* locname = NULL;
28     const wchar_t* strzh = L"中文字符串";
29   
30     print_current_loc();
31   
32     // 使用指定的 locale
33     locname = setlocale(LC_ALL, LC_NAME_zh_CN_DEFAULT);
34     if ( NULL == locname )
35     {
36         printf("setlocale() with %s failed.\n", LC_NAME_zh_CN_DEFAULT);
37     }
38     else
39     {
40         printf("setlocale() with %s succeed.\n", LC_NAME_zh_CN_DEFAULT);
41     }
42   
43     print_current_loc();
44   
45     wprintf(L"Zhong text is: %ls\n", strzh);
46   
47     // 使用运行环境中的 locale 设置
48     locname = setlocale(LC_ALL, "");
49     if ( NULL == locname )
50     {
51         printf("setlocale() from environment failed.\n");
52     }
53     else
54     {
55         printf("setlocale() from environment succeed.\n");
56     }
57   
58     print_current_loc();
59   
60     wprintf(L"Zhong text is: %ls\n", strzh);
61   
62     puts("End of program.");
63     return 0;
64 }
65   
66 // 打印当前 locale
67 void print_current_loc()
68 {
69     char* locname = setlocale(LC_ALL, NULL);
70     printf("Current locale is: %s\n", locname);
71 }

要使上面程序成功编译并执行,需要注意一下几点:

Windows CRT 是不支持 UTF-8 编码作为 locale 的,运行时使用 setlocale(LC_ALL, ".65001") 会失败。

使用 Linux 和 Cygwin 的 glibc 时,要在终端显示正确的中文,需满足以下条件:

  1. 不要混用 char 和 wchar_t 版本的流操作函数,否则会导致这些函数运行异常,我用Cygwin GCC 4测试混用 printf() 和 wprintf() 时,程序甚至崩掉,所以要将上面程序中 printf() 语句全注释掉才行。Window CRT 的实现则没有这个问题。

  2. 运行环境的 locale 设置要和程序中 setlocale() 设定的 locale 一致,比如:终端的活动字符集、环境变量(一般用 LANG),要设置为 *.UTF-8,才能显示 setlocale(LC_ALL, "zh_CN.UTF-8") 设定的 wchar_t 的中文字符。

  3. 用 GCC 编译时,要使用 UTF-8 编码保存源文件,这是 GCC 在编译时,将 wchar_t 文字量(以 L 打头)正确转换为 UCS 编码保存在对象文件中的必需条件,用 Native ANSI 编码(比如:GBK)有 wchar_t 文字量的源文件时,GCC 会编译出错,Linux 和 Cygwin 的 GCC 都有这个约束。另外在 Linux GCC 使用 UCS-4 编码保存 wchar_t,而 Windows 和 Cygwin GCC 使用 UCS-2。

  4. 用 wprintf() 时,要用 %ls 表示 wchar_t 的字符串,用 %s 表示 char 的字符串,具体参考:man 3 wprintf,而 Windows 的实现用 %ls、%s 都可以正确输出 wchar_t 字符串。

 

http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039700.html

今天关于MinGW“程序入口点libintl_setlocale找不到…”mingw安装后找不到程序的介绍到此结束,谢谢您的阅读,有关-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory、/bin/bash: 警告: setlocale: LC_ALL: 无法更改区域设置 (en_US.UTF-8)、c – 使用MinGW / MSYS和CMake对`libintl_gettext’进行未定义的引用、C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方...等更多相关知识的信息可以在本站进行查询。

本文标签: