警告:多字符字符常量 [-Wmultichar]

Posted

技术标签:

【中文标题】警告:多字符字符常量 [-Wmultichar]【英文标题】:warning: multi-character character constant [-Wmultichar] 【发布时间】:2014-07-01 06:14:28 【问题描述】:

我想要一个希腊字母数组,这就是我要做的:

wchar_t pcletters[30] = 'α' , 'ά' , 'β' , 'γ' , 'δ' , 'ε' , 'ζ' , 'η', 'θ' , 'ι' , 'κ' , 'λ' , 'μ' , 'ν','ξ' , 'ο' , 'π' , 'ρ' , 'σ' , 'τ' , 'υ' , 'φ' , 'χ' , 'ψ' , 'ω', 'έ' , 'ή' , 'ί' , 'ό' , 'ύ' , 'ώ' ;

我还包括<locale.h> 并有一行setlocale(LC_CTYPE, "") .

但是我收到警告。 此外,当我通过以下方式检查其中一个字母是否在用户输入中时:

if (userword[i] == pcletters[j]) //do stuff 

它似乎不起作用。 - 为什么我会收到此警告? - 有没有办法以能够比较的方式改变pcletters userword[i] == pcletters[j]

注意:userword 的定义如下:wchar_t userword[40]

【问题讨论】:

我觉得你需要wchar_t pcletters[30] = L'α', L'ά', L'β', L'γ', ... 我认为希腊字母表是一个多字节字符字母表,这意味着一个char 不足以容纳一个字母。西班牙语反向问号也是如此(这可能导致 addlashes 的安全失败)。 【参考方案1】:

使用宽字符文字:

wchar_t pcletters[30] = L'α' , ...
                         ^

请注意,这仅适用于您正在编写的字母是单个宽字符的平台;这应该适用于 Windows,其中wchar_t 是 UCS-2。

【讨论】:

ℑ???'???????????????????????????????????????????????????????????????????????????>????????????>> @Hi-Angel 是的,这专门用于目标平台上适合单个 wchar_t 的字符。 @ecatmur 即使在 UTF16 中也不适合两个字节,like surrogate pairs。我倾向于认为wchar_t 的使用是个坏主意。 AFAIK C++ 标准不提供使用 Unicode 的工具,因此必须使用备用库来完成工作。至于最低限度的支持——我认为多字节字符应该存储为字符串。 @Hi-Angel 任何处理一般文本的人迟早都必须处理扩展平面甚至多代码点字符 - 感谢 Unicode 的表情符号。但我不确定这与这个问题有什么关系。 @ecatmur 这是相关的,因为从搜索引擎到这里的每个人都会认为wchar_t 是灵丹妙药,而实际上并非如此。这个问题已经有 3k 的浏览量。所以我觉得应该有人在这里留下警告☺

以上是关于警告:多字符字符常量 [-Wmultichar]的主要内容,如果未能解决你的问题,请参考以下文章

不兼容的转换字符

关于Unicode和多字符字集。

现有个20000多字符数的数据怎么导入到oracle表格中,oracle数据库Crate表格用哪种数据类型?

C++ 数组中的多字节 UTF-8

c语言符常09

标准 C 库中是不是有 strchr() 的多字符版本?