Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测字符串中的CJK字符(C#)_C#_.net_Regex_Itextsharp_Cjk - Fatal编程技术网

检测字符串中的CJK字符(C#)

检测字符串中的CJK字符(C#),c#,.net,regex,itextsharp,cjk,C#,.net,Regex,Itextsharp,Cjk,我正在使用iTextSharp生成一系列PDF,使用OpenSAN作为默认字体。有时会在PDF的内容中插入姓名。但是,我的问题是,我需要插入的一些名称包含CJK字符(存储在SQL Server的nvarchar列中),据我所知,Open SAN目前不支持CJK字符。我需要继续使用Open SAN作为默认字体,因此理想情况下,我希望尝试检测从数据库抓取的字符串中的CJK字符,并在打印这些字符时切换到CJK字体 正则表达式是最好的选择吗?不幸的是,我还没有找到任何正则表达式模式可以帮助解决这个问题

我正在使用iTextSharp生成一系列PDF,使用OpenSAN作为默认字体。有时会在PDF的内容中插入姓名。但是,我的问题是,我需要插入的一些名称包含CJK字符(存储在SQL Server的nvarchar列中),据我所知,Open SAN目前不支持CJK字符。我需要继续使用Open SAN作为默认字体,因此理想情况下,我希望尝试检测从数据库抓取的字符串中的CJK字符,并在打印这些字符时切换到CJK字体

正则表达式是最好的选择吗?不幸的是,我还没有找到任何正则表达式模式可以帮助解决这个问题


提前感谢您的帮助

我确实编辑了daves的答案,使其生效,但显然只有我才能看到,直到同行评审,所以我将把解决方案作为我自己的答案发布。基本上,dave只需要将他的正则表达式扩展到:

string regex = 
@"\p{IsHangulJamo}|"+
@"\p{IsCJKRadicalsSupplement}|"+
@"\p{IsCJKSymbolsandPunctuation}|"+
@"\p{IsEnclosedCJKLettersandMonths}|"+
@"\p{IsCJKCompatibility}|"+
@"\p{IsCJKUnifiedIdeographsExtensionA}|"+
@"\p{IsCJKUnifiedIdeographs}|"+
@"\p{IsHangulSyllables}|"+
@"\p{IsCJKCompatibilityForms}"; 
这样使用时将检测韩语字符:

string subject = "도형이";

Match match = Regex.Match(subject, regex);

if(match.Success)
{
    //change to Korean font
}
else
{
    //keep calm and carry on
{

为了防止任何人偶然发现这个问题,我在正则表达式中找到了另一个使用这里列出的unicode块()的解决方案

var Name = "Joe Bloggs";
var Regex = new Regex(@"\p{IsCJKUnifiedIdeographs}");

if(Regex.IsMatch(Name))
{
    //switch to CJK font
}
else
{
    //keep calm and carry on
}
编辑:

您可能需要匹配的不仅仅是统一的表意文字,请尝试将其用作正则表达式:

string r = 
@"\p{IsHangulJamo}|"+
@"\p{IsCJKRadicalsSupplement}|"+
@"\p{IsCJKSymbolsandPunctuation}|"+
@"\p{IsEnclosedCJKLettersandMonths}|"+
@"\p{IsCJKCompatibility}|"+
@"\p{IsCJKUnifiedIdeographsExtensionA}|"+
@"\p{IsCJKUnifiedIdeographs}|"+
@"\p{IsHangulSyllables}|"+
@"\p{IsCJKCompatibilityForms}"; 

这适用于我试用过的所有韩文文本。

使用iTextSharp.text.pdf.FontSelector

iTextSharp.text.pdf.FontSelector selector = new iTextSharp.text.pdf.FontSelector();

// add 2 type of font to FontSelector
selector.AddFont(openSansfont);
selector.AddFont(chinesefont);


iTextSharp.text.Phrase phrase = selector.Process(yourTxt);
FontSelector将为您使用正确的字体

源文件FontSelector.cs中的详细说明

选择包含正确呈现文本所需字形的适当字体。按顺序检查字体,直到找到字符

我忘了它先搜索哪个订单了!!请体验一下!! 编辑:顺序是从第一个addFont到最后一个addFont


是的,我想这应该能抓住他们所有的机会!我一定会试一试的。谢谢王!