utuntu unicode打印中文

银河麒麟V10离线升级OpenSSH实战:从编译到回滚全流程 OpenSSH作为Linux系统远程登录的核心组件,其版本升级直接关系到系统安全与等保合规。在信创环境下,银河麒麟V10自带的OpenSSH版本往往无法满足漏洞扫描与安全加固要求,而离线编译升级涉及依赖处理、编译参数、服务替换与回滚方案等多个技术环节。本文围绕银河麒麟V10(x86_64)平台,详细讲解OpenSSH离线升级的完整实操流程,包括环境摸底、依赖包安装、源码编译、配置文件兼容性处理、服务重启验证以及常见问题排查,并分享批量升级与安全加固的工程经验,帮助运维人员在不断网、不重装的前提下一次成功完成 阅读详情

在程序开发中,遇到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
























Isaac Sim/Lab & ROS2 入门教程 —— 宇树人形机器人 H1 强化学习策略部署 本文介绍了如何通过ROS2和IsaacSim运行H1人形机器人的强化学习运动策略。主要内容包括:1)设置机器人关节配置和初始位置;2)添加IMU传感器;3)配置ROS2节点以发布观测数据和接收动作指令;4)创建模拟环境并发布ROS时钟;5)最终运行ROS2策略实现对机器人的键盘控制。文中详细说明了关节参数设置、传感器配置、ROS2节点创建等关键步骤,并提供了注意事项和验证方法。完成配置后,用户可通过键盘指令控制机器人在平坦地形上的运动。 阅读详情

相关推荐

MATLAB仿真实战:双有源桥(DAB)变换器的扩展移相调制(EPS)全流程解析

本文提供了一份详细的MATLAB/Simulink仿真实战指南,手把手解析双有源桥(DAB)变换器在扩展移相调制(EPS)下的全流程建模。内容涵盖从核心原理、主功率电路搭建、EPS驱动信号生成,到仿真运行、波形分析及模型优化的完整步骤,旨在帮助工程师和研究者快速掌握DAB变换器的仿真与性能验证方法。

o4p5q6r7s的博客 503

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

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

xiayuleWA的专栏 4万+

Dify整合FireCrawl与百度搜索实战:手把手教你打造全能研究助手

本文手把手教你基于Dify平台,整合FireCrawl网页爬虫与百度搜索能力,构建一个能同时处理本地文档与实时网络信息的全能研究助手。通过部署核心环境、配置模型、接入两大工具并设计自动化工作流,实现从问题提出到深度分析报告生成的一站式解决方案,极大提升信息调研与整合效率。

weixin_29062963的博客 500

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

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

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

Qoder Quest 模式实战:从需求到代码的自动化开发

本文深入探讨Qoder Quest模式如何实现从需求到代码的自动化开发。通过编写清晰的Spec规格说明,Qoder能智能分解任务并在后台执行,生成高质量代码,大幅提升开发效率,让开发者专注于架构设计等创造性工作。

herb5的博客 1151

海康线扫相机平场矫正实战:从原理到精准成像

本文深入解析了海康线扫相机平场矫正的原理与实战操作。通过拆解暗场与明场矫正的物理意义,揭示了其消除系统噪声、补偿像素响应不均的核心机制。文章详细指导了在海康相机上进行平场矫正的标准化流程、关键参数设置(如行高、灰度值控制)及常见误区,并提供了针对高行频匹配、环境稳定性维护等进阶调优技巧与问题排查指南,旨在帮助用户实现从原理理解到精准成像的跨越。

tomato的博客 790

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

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

程序猿的白兰日常 2553

保姆级教程:在瑞芯微RV1126B上部署轻量化YOLOv8,实现端侧实时目标检测

本文详细介绍了在瑞芯微RV1126B芯片上部署轻量化YOLOv8模型的完整流程,包括开发环境搭建、模型训练优化、量化转换及嵌入式部署。通过利用RV1126B的3TOPS NPU算力和AI-ISP特性,实现端侧实时目标检测,提升边缘AI应用的性能和效率。

weixin_30329623的博客 266

printf格式化输出

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

超哥的专栏 3090

微信小程序|基于小程序+云开发制作一个菜谱小程序

今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

数仓建模—维度建模之维度表

首先要学会识别维度,维度是相对稳定的、可抽象具有共性的、固有的(天然的)描述度量或事实的上下文属性信息,失去维度信息的度量信息是没有意义的或者说是失去维度信息的事实表是没有意义的。其次要掌握维度表的设计原则和设计流程,从而更加科学的设计维度表,其实这些东西都是术,我们一直都说一句话大道至简,其实如果你掌握了精髓,抛开这些术也可以做到得心应手,这就像张无忌练太极剑一样,忘记了才能达到道的境界,也就是无我,如果做不到就记住这些原则加以应用从而达到术的境界。

2401_84052244的博客 4361

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

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

暗恋的滋味 5万+

Unreal5从入门到精通之如何在VR中使用3DUI

前面我们讲过《Unreal5从入门到精通之UMG的使用》一般制作游戏时,UI都是添加到屏幕视窗上面的,但是在制作VR时,我们往往需要制作一个3D的UI,放置在场景中,然后使用手柄的射线来和UI进行交互。今天我们就来讲解下,如何在VR中创作和交互3DUI首次操作会感觉好复杂,多多练习,当你熟悉了UE蓝图的操作后会发现,这只是一个常规的蓝图操作而已。祝大家在虚幻的学习过程中非常顺利。希望这篇博客对你有所帮助。

TxNet 1984

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

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

2038

VC中sqlite的使用

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

ZLK1214的专栏 1663

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

qq_31716541的博客 6984

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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、付费专栏及课程。

余额充值