utuntu unicode打印中文

Acgis中实现栅格经纬度和行政区关联 目前已有意大利的shp文件,希望将意大利划分成0.1*0.1经纬度的栅格,并且关联每个栅格中心点所属的省份信息。最终希望得到的输出是一个表格,里面包含栅格的经纬度、所属省份信息。 阅读详情

在程序开发中,遇到unicode utf-8编码时,不能向屏幕打印中文字符的情况,经过试验测试可行的方法如下:

程序实例1:

  1. // 注意,此文档最好采用utf-8编码  
  2. #include <stdio.h>  
  3. #include <wchar.h>  
  4. #include <locale.h>  
  5.   
  6. int main()    
  7. {  
  8.     //此语句重要,在win7 + vs2012和 ubuntu 12.04测试结果一致  
  9.     //只要打印wchar_t字符,均加此语句,至少不会出错,此语句最好在程序初始化处  
  10.     setlocale(LC_ALL, "");    
  11.       
  12.   
  13.     // wprintf和printf最好不能同时使用.    
  14.     // 如下使用printf同时打印了char字符串和wchar_t字符串  
  15.     // 因此只采用printf是比较好的方法  
  16.     wchar_t ws[] = L"国家";   
  17.     printf("printf content start: %ls\n", ws);            
  18.     printf("content end\n");  
  19.   
  20.     return 0;            
  21. }        

用上面代码的原因: 

1. 从后面我的实验可以看到, 有八种组合方式, 唯独选择这么一种是有原因的.

2. wprintf 和 printf 通用会遇到莫名其妙的问题, 

3 . printf可以打印char, 使用格式为小写%s, 也可以打印wchar_t, 使用格式为%ls 或者 大写%S

4. 只要源文件编码为utf-8, 上面的代码就是跨操作系统和编译器平台的, 并且可以统一用一种方式打印char 和 wchar_t 字符串 


代码实例2:

#include <iostream>

#include <wchar.h>

using namespace std;

int main()

{

setlocale(LC_ALL,"");

wchar_t ws[]=L"中华人民共和国";

wcout<<ws<<endl;

return 0;

}

注: 需要统一使用wcout,如果前面有使用cout则为错误输出

下面为比较细节的讨论。


关于编码字符集:简单理解为,ascii码表达了美国英文字符,为一字节.

为了统一世界文字编码,出了unicode,如ucs-2,ucs-4,分别为16字节和32字节

因为历史包袱,unicode不可能完全替代以前的编码,所以出了有使用性的UTF-8编码,字节大小不定。


如何快速查看一个文字编码?如“国“字的utf-8编码是什么? 简单方法是新建一文件,记事本输入“国”, 记事本另存为,选择文件编码。 然后使用如下方式打开此文件,1:使用winhex软件 2. 使用notep++,选中文字”国“,点击菜单插件->converter->ascii to hex, 3, 其它.... (在线的就算了,我看了百度两个排名前两位的网站根本不是转的UTF-8, 而是转成了ucs-2,虽然其号称是转换成UTF-8)


如下表格是使用wchar_t的总结,其中编码格式设置是通过notepad++的格式菜单进行的,如下表格的测试代码后面会贴出来。





表格解释: 

1.采用ansi编码方式,在ubuntu下会出错,另外通过g++ -Wall -finput-charset=ISO-8859-1 test.cpp 方式可以指定输入文件格式,但是这样很麻烦,因为首先要知道文件的格式是什么,在ubuntu下 通过file  test.cpp 命令可以查到,我把ISO-8859-1到ISO-8859-16都试了,文件编码格式ANSI(即ISO8859-XX)且文件中有L"国家" 类似字符,编译不会通过,或者通过-finput-charset=xxx指定文件格式编译通过后输出也不对,故太麻烦。

2.在windows下和ubuntu下都通过的方式是文件编码采用UTF-8。

3.printf和wprintf不能混用,即一个程序中使用了printf, 就不使用wprintf,反之也是,既然printf输出char 和 wchar_t字符都可以,所以统一使用printf是最佳选择。

  当然使用printf打印wchar_t时格式不一样,是%ls 或大写的%S,  例如: printf("wide char: %ls\n", ws);

4. 一旦要打印中文字符,在程序初始化时加一句setlocale(LC_ALL, ""); 否则打印中文会出错。

5. windows 对 字符串的内部编码比较统一,char的编码都成ANSI,如 char  s[] = "国家", s里存的是”国家”的ANSI编码

      wchar_t的编码都成UCS-2,如 wchar_t  ws[] = L"国家", s里存的是”国家”的UCS-2编码

    UBUNTU 对字符串的处理不是很统一,char 字符串的编码是随着文件编码格式有所变化,如文件为ansi,则ubuntu也为ansi,文件为UTF-8, 则char s[] = "国家" 里的也是            UTF-8编码。

       wchar_t 则默认采用ucs-4编码。


总结:源代码文件编码用UTF-8, 打印采用printf是跨平台(操作系统,编译器), 跨char和wchar_t的最佳解决方案之一,另外不能忘了 setlocale(LC_ALL, "");


说的再多,不如自己测试下,如下为测试代码,一共有5种case,每次注释掉其他case,留要测试的case,并按照case注释处更改文件编码方式便可, 更改编码方式采用notepad++最方便了.

#include <stdio.h>  
#include <string.h>   
#include <stddef.h>  
#include <wchar.h>  
#include <locale.h>  
  
// 测试运行环境:  
// ubuntu 12.04 + g++ 4.6.3(或gcc,改文件后缀就行)   
// windows 7 + vs2012  
// 说明,在注释中说的编码E59BBD,是按照打印结果从低字节到高字节排练,并不一定和实际  
// 的编码大小端一致。  
  
int main()    
{  
    //此语句重要,在win7 + vs2012和 ubuntu 12.04测试结果一致,只要打印wchar_t字符,均加此语句,否则出错。  
    setlocale(LC_ALL, "");          
                  
    /******************  case 1  **********************************/      
    // 文件utf-8编码, 字符串不加L  
    // ubuntu : ws是utf-8编码: 如"国":E59BBD; 打印结果:国家  
    // windows: ws是ansi编码: 如"国":b9fa; 打印结果: 国家  
/*  char ws[] = "国家";  
    char *p = (char *)ws; 
    int i = 0; 
      
    printf("sizeof(ws) is %d\n", sizeof(ws)); 
    for (; i < sizeof(ws); i++){   
        printf("byte: %x\n", p[i]);  
    } 
    printf("content start\n");    
    printf("%s\n", ws); 
    printf("content end\n");      */    
  
        /******************  case 2  **********************************/      
    // 2: 文件ansi编码, 字符串不加L  
    // ubuntu : ws是ansi编码,如"国":b9fa; 打印结果:无,出错  
    // windows: ws是ansi编码: 如"国":b9fa; 打印结果: 国家  
/*      char ws[] = "国家"; 
    char *p = (char *)ws;   
    int i = 0;  
     
    //setlocale(LC_ALL, "zh_CN.UTF-8");         
    printf("sizeof(ws) is %d\n", sizeof(ws)); 
    for (; i < sizeof(ws); i++){ 
        printf("byte: %x\n", p[i]);        
    } 
    printf("content start: %s\n", ws);       
    printf("content end\n");  */     
      
      
    /******************  case 3  **********************************/      
    // 3: 文件utf-8编码, 字符串加L, 必须采用wchar_t, 用char编译器报错, 用wprintf打印    
    // ubuntu : ws是ucs-4编码,如"国":0x000056fd; 打印结果:国家  
    // windows: ws是ucs-2编码: 如"国":0x56fd; 打印结果: 国家  
/*  wchar_t ws[] = L"国家";   
    char *p = (char *)ws;   
    int i = 0;       
                
    wprintf(L"sizeof(ws) is %d\n", sizeof(ws)); 
    for (; i < sizeof(ws); i++){   
        wprintf(L"byte: %x\n", p[i]);               
    }     
 
    wprintf(L"wprintf content start:\n");  //必须用wprintf, 且wprintf和printf不能同时使用. 
    wprintf(L"%ls\n", ws);                 
    wprintf(L"content end\n");    */          
      
        /******************  case 4  **********************************/      
    // 4: 文件utf-8编码, 字符串加L, 必须采用wchar_t, 用char编译器报错, 用printf打印    
    // ubuntu : ws是ucs-4编码,如"国":0x000056fd; 打印结果:国家  
    // windows: ws是ucs-2编码: 如"国":0x56fd; 打印结果: 国家  
    wchar_t ws[] = L"国家";   
    char *p = (char *)ws;         
    int i = 0;        
                
    printf("sizeof(ws) is %d\n", sizeof(ws));  
    for (; i < sizeof(ws); i++){    
        printf("byte: %x\n", p[i]);              
    }          
  
    printf("printf content start:\n");  //wprintf和printf不能同时使用.  
    printf("%ls\n", ws);                  
    printf("content end\n");  
  
    /******************  case 5  **********************************/           
    // 5: 文件ansi编码, 字符串加L, 必须采用wchar_t, 用char编译器报错  
    // ubuntu : 编译不通过  
    // windows: ws是ucs-2编码: 如"国":0x56fd; 打印结果: 国家  
/*  wchar_t ws[] = L"国家"; // 文件ansi编码,ws是unicode编码: 如国:56fd 
    char *p = (char *)ws;     
    int i = 0;     
               
    wprintf(L"sizeof(ws) is %d\n", sizeof(ws)); 
    for (; i < sizeof(ws); i++){         
        wprintf(L"byte: %x\n", p[i]);               
    }       
 
    wprintf(L"wprintf content start:\n");  //必须用wprintf, 且wprintf和printf不能同时使用. 
    wprintf(L"%ls\n", ws);                 
    wprintf(L"content end\n");   */         
      
    while(1); //方便看结果  
    return 0;            
}


其他相关参考资料

https://www.polarxiong.com/archives/ubuntu%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%AD%E8%AE%BE%E7%BD%AElocale%E4%B8%BA%E4%B8%AD%E6%96%87%E4%BB%8D%E7%84%B6%E6%97%A0%E6%95%88%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html

http://www.cnblogs.com/yg_zhang/p/4331498.html

http://blog.youkuaiyun.com/magicxiaoz/article/details/4347414
























个人量化系统的策略集合与赚钱之道:全栈深度解析 + 与主流开源框架对比 前三篇把系统的"骨架"拆完了——架构、工程化、部署。本篇回答最关键的问题:一句话:别人的系统是"程序员的系统"(写代码才能加策略),daily_stock_analysis 是"股民的 YAML"(写中文就能加策略)。这个差异决定了它能在多大程度上真的帮你赚钱。如果你用过 、、,加一个策略的流程是: 问题在哪?在 daily_stock_analysis 里,“策略” = 一个文件。每个 YAML 是一个自然语言描述的交易策略,包括: 看到没? ——整个策略就是一段中文,零代码。任何会写字的人都能加新策略 阅读详情

相关推荐

5分钟搞懂双目相机标定:从棋盘格到3D点云的完整流程(附Python代码)

本文详细介绍了双目相机标定的完整流程,从棋盘格准备到3D点云生成,涵盖单目标定、双目标定、立体校正、视差计算等关键步骤。通过Python代码示例,帮助读者快速掌握双目立体视觉技术,实现高精度的3D重建。特别适合机器人导航、工业检测等应用场景。

weixin_29100399的博客 585

c/c++语言printf/wprintf,wchar_t中文字符输出总结

关于编码字符集:简单理解为,ascii码表达了美国英文字符,为一字节 为了统一世界文字编码,出了unicode,如ucs-2,ucs-4,分别为16字节和32字节 因为历史包袱,unicode不可能完全替代以前的biam

xiayuleWA的专栏 4万+

Circos图审美拯救计划:用TBtools复刻Nature级共线性分析图谱

本文针对Circos图在共线性分析中的审美提升问题,提供了一套基于TBtools的完整优化方案。通过构建和谐的色彩体系、精细控制信息层布局以及模仿顶刊构图逻辑,详细讲解了如何从配色、透明度、标签显示到高级参数设置,将默认图表升级为具有高级学术美感的Nature级图谱,助力研究者提升论文图表质量。

cherry的博客 911

C语言格式化输出wchar_t * 中文乱码

在测试遍历打印文件名时,文件名带中文的全部显示问号。

记录日常开发的小问题备忘 4282

【LVGL】学习笔记--(3)界面切换以及显示优化

界面切换和帧率优化

sinat_33408502的博客 1万+

期货分仓系统CTP协议/国内期货软件源码

期货分仓系统与CTP协议以及国内期货软件源码是期货交易技术领域的几个重要方面。

q2247238820的博客 960

格式规范语法:printf和wprintf函数

格式字符串包含零个或多个指令,这些指令是用于输出的文本字符或描述如何在输出中设置参数格式的已编码的转换规范。转换规范的每个字段都是一个用于指示特定的格式选项或转换说明符的字符或数字。字段控制格式的其他方面(如前导空格或前导零、对齐方式和显示的精度)。大小字段指定使用和转换的参数的大小。指定单字节和多字节或宽字符字符串,具体取决于正在使用的格式设置函数。如果百分号后跟一个没有任何意义的字符作为格式字段,则将调用无效的参数处理程序。将根据相应的类型字符和可选的大小前缀对紧跟格式字符串的参数进行解释。

程序猿的白兰日常 2553

stm32h743 FM25CL64铁电存储器踩坑记录

调试FRAM经验总结: 1、跑完FRAM读写代码之后,逻分仪发现总线上只有简单、短暂的电平变化,明显不是SPI的通信数据。 (经提醒发现连片选拉高拉低都没有执行到位) 后来发现是因为片选引脚没有初始化,所以直接拉高拉低是无效的。 2、引脚成功初始化后发现CLK、MISO、MOSI数据仍不正常。通过加打印的方式发现跑到HAL_SPI_Transmit中之后还没有执行到写SPI数据寄存器的那一步就return了。 后来经提醒发现: 上图中的指针使用方式错误 后来又发现: 打印出来发现

kuniqiw的博客 3844

printf格式化输出

%c:字符 %d:整数 %i:整数(老) %e:浮点数(指数形式) %f:浮点数(%nf,n表示小数点后n位) %g:浮点数(自动选择合适的格式) %o:八进制数 %s:字符串 %x:十六进制数 %p:指针 %u:无符号整数 %zu:size %a: 浮点数、十六进制、p-记数法 %A:大写浮点数、十六进制、P-

超哥的专栏 3090

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 477

2小时用Trae搭建全功能CMS系统

在前文中,我们使用Trae从零搭建了一个用户文档站点,仅用不到2小时就实现了用户注册登录和文档的增删改查功能,且无需编写任何代码。本节我们将在此基础上,构建一个CMS后台管理系统,包含用户管理和文档管理两大功能模块。

2501_92019101的博客 540

浅谈C中的wprintf和宽字符显示

 今天在优快云的Blog首页看到一篇文章“也谈计算机字符编码 ”,由于前一阵业余翻译了“UTF-8 and Unicode FAQ for Unix/Linux”一文,自己对字符集、编码和Unicode等内容一直保着者很强的兴趣,自然不会放过这样的文章。作者的文章写得很明白易懂,虽然有一些概念上的细节问题我觉得有商榷之处;作者还给出一个简单的在windows下使用wprintf正确输出字符串“中

暗恋的滋味 5万+

C/C++基础讲解(四十三)之图形篇之绘制直线、圆、圆弧、 椭圆

程序主要是基于Visual studio 2019进行编译完成了,有兴趣的小伙伴可以自己安装下Visual studio 2019,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:绘制直线 实例2:绘制圆 实例2:绘制圆弧 实例2:绘制椭圆

hnjzfwy的博客 1234

浅谈C中的wprintf和宽字符显示【其实很深】

作者还给出一个简单的在windows下使用wprintf正确输出字符串“中文”的小例子,我linux下模仿作者给出的示例代码写了如下的示例代码: #include<cstdio>#include<cstdlib>#include<clocale>#include<cwchar>intmain(intargc,char*argv[]){wchar_twstr[]=L"中文...

2038

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

解决C语言wprintf函数无法打印中文的问题

在Visual Studio中,wchar_t[]字符数组用来存储UTF-16编码的字符串,但C语言库函数wprintf无法打印含有汉字的wchar_t字符串。解决办法是用WriteConsoleW函数重新实现一个自己的my_wprintf函数。

ZLK1214的专栏 1663

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C语言printf() 详解之终极无惑

C语言printf() 详解之终极无惑

qq_31716541的博客 6984

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

visual studio 2022中printf()和wprintf()差异

在 Visual Studio 2022 中,printf()和wprintf()是 C/C++ 标准库中的两个输出函数,它们的核心区别在于和的使用规则。

felicity_one的博客 814

控制台程序的中文输出乱码问题,printf,wprintf与setlocale

#include #include int main(void) { char str[] = "中文"; wchar_t wstr[] = L"中文"; printf("1:%s\n", str); wprintf(L"2:%s\n", wstr); return 0; }

Star的IT专栏 1万+

C语言宽字符输出难题:如何用printf正确打印wchar_t?

解决C语言宽字符输出难题,掌握printf正确打印wchar_t的方法。适用于多语言程序开发,通过设置本地化环境并使用%ls格式符,实现中文等宽字符的准确显示,提升跨平台兼容性,值得收藏。

AlgoInk的博客 1015

wprintf、wcout输出中文和unicode中文字符串的转换问题

本来想搞明白点wchar_t,就写了个很简单的wcout的例子,结果中文无法输出,然后换成wprintf,却还是不行~于是在网上搜啊搜,总算解决了问题,总结一下: 试着运行下面的代码: wchar_t *ws = L"你好"; wcout << ws << endl; 这样没有任何输出,必须将locale设为本地语言,就是在wcout前加入下面这句话就可以: std::wcout.imbue( locale(locale(), "", LC_CTYPE) ); //注:如

wzxiaodu的专栏 931

C / C++的wprintf打印速度太慢,改WriteConsoleW输出提速200+倍

在 C / C++ 处理将UTF-8字符串内容输出到终端控制台时,平时惯用一个广泛使用的 `wprintf()` 函数,虽然它支持 Unicode 、UTF-8 字符,但在测试过程中发现它输出大文件时会有严重拖累性能,对比 Windows 自带的 type 命令,type 命令输出同一个文件需要大约5秒。` ,该函数以高效处理 Unicode 字符而闻名,允许直接写入控制台,而且支持 UTF-16 编码的字符串。`wprintf()` 函数在打印改文件时,文本在命令行窗口里哗哗直流,最终耗时超过81秒。

Scott0902的博客 1139

宽字符与窄字符的处理

1.      《windows核心编程》 >Unicode是传递字符串的最佳手段。 2.      C标准库中与wchar_t相关的文件: 《windows核心编程》 1)      文件”string.h”定义了wchar_t数据类型: {{{    typedef unsignedshort wchar_t; }}} 2)      标准的ANSI C函数和它们等价的UNIC

hunterzone的专栏 1万+

使用swprintf代替sprintf,格式化wchar_t

swprintf和sprintf最大区别,就是swprintf要加个长度限制。

柳鲲鹏 880

C++中关于文字编码的问题(格式化字符串)

char与wchar_t char中存放的是多字节型的字符,wchar_t中存放的是双字节型的字符,TCHAR在定义了_UNICODE时等同于wchar_t,在未定义_UNICODE时等同于char。   sprintf、wsprintf、_stprintf sprint

一剑之下的天空 2099

从乱码到完美显示:揭秘C语言printf与wprintf的宽字符真相

解决C语言宽字符输出乱码难题,深入解析C语言printf输出宽字符(wchar_t)的正确方法。涵盖Windows/Linux平台适用场景,对比wprintf与printf的差异,揭示编码设置与locale配置关键步骤。掌握多字节与宽字符转换技巧,实现中文等Unicode字符完美显示,值得收藏。

LiteCode的博客 931

c++ char* 与 wchar_t* 互转

char dd[256]; const wchar_t* wc = L"Hellow World"; sprintf(dd, "%ws", wc); //wchar_t* 转 char* MessageBoxA(NULL, dd, "test", 0); TTestClass tt; const char *aa ="helloworld"; wchar_t bb[100]; swprintf(bb, 100, L"%hs", tt.Get...

全粘工程师 1568
上一篇: linux创建线程和windows创建线程对比
下一篇: C++ Unicode SBCS 函数对照表
卫水金波
博客等级 码龄12年 73粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值