我使用iTextSharp生成一系列PDF,使用Open Sans作为默认字体。有时,名称会插入到PDF的内容中。但是我的问题是我需要插入的一些名称包含CJK字符(存储在SQL Server中的nvarchar列中),据我所知,Open Sans目前不支持CJK字符。我需要继续使用Open Sans作为我的默认字体,所以理想情况下我想尝试检测从数据库中获取的字符串中的CJK字符,并在打印出这些字符时切换到CJK字体。
正则表达式是最好的选择吗?遗憾的是,我无法找到任何有助于此的正则表达式。
提前感谢您的帮助!
答案 0 :(得分:7)
只是让任何人在这个问题上遇到麻烦,我找到了另一个使用正则表达式中列出的unicode块(http://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedNamedBlocks)的解决方案。
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}";
适用于我试过的所有韩文文本。
答案 1 :(得分:2)
使用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。
答案 2 :(得分:1)
我确实编辑了daves的答案以使其正常工作,但显然只有我能看到它,直到它的同行评论,所以我将发布解决方案作为我自己的答案。基本上戴夫只需要将他的正则表达式扩展到这一点:
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
{