我需要将第三方提供的一些字符串保存到我的数据库(Postgres)中。有时候这些字符串太长了,需要截断以适应我的数据表中的列。
但是有时我会不小心在Unicode字符处截断字符串,这会导致我无法将“损坏”的字符串保存到数据库中。我会收到以下错误:Unable to translate Unicode character \uD83D at index XXX to specified code page。
我创建了一个最简示例来说明我的意思。这里有一个包含Unicode字符(“小蓝钻石” U+1F539)的字符串。根据我截取的位置不同,它会给我一个有效的字符串或无效的字符串。
但是有时我会不小心在Unicode字符处截断字符串,这会导致我无法将“损坏”的字符串保存到数据库中。我会收到以下错误:Unable to translate Unicode character \uD83D at index XXX to specified code page。
我创建了一个最简示例来说明我的意思。这里有一个包含Unicode字符(“小蓝钻石” U+1F539)的字符串。根据我截取的位置不同,它会给我一个有效的字符串或无效的字符串。
var myString = @"This is a string before an emoji: This is after the emoji.";
var brokenString = myString.Substring(0, 34);
// Gives: "This is a string before an emoji:☐"
var test3 = myString.Substring(0, 35);
// Gives: "This is a string before an emoji:"
有没有办法在不破坏任何Unicode字符的情况下截断字符串?
var newStr = new StringInfo(text).SubstringByTextElements(0, maxChars);
,那么newStr.Length
不等于maxChars
。我错过了什么吗? - Toolkitstring
的长度,为了获取newStr
中字符的数量,你需要再次创建一个StringInfo
实例,然后使用LengthInTextElements
属性,请参见此 C# 演示。 - Wiktor Stribiżew