我有一个MVC Razor视图
@{
ViewBag.Title = "Index";
var c = (char)146;
var c2 = (short)'’';
}
<h2>@c --- @c2 --’-- ‘Why Oh Why’ & ’</h2>
@String.Format("hi {0} there", (char)146)
在varchar字段中存储在我的数据库中的字符不会呈现给浏览器。 此示例演示角色146未显示的方式 如何让它们渲染?
[编辑]
当我这样做时,角色146会转换为UNICODE 8217,但如果试图直接在浏览器上渲染146则失败
public ActionResult Index()
{
using (var context = new DataContext())
{
var uuuuuggghhh = (from r in context.Projects
where r.bizId == "D11C6FD5-D084-43F0-A1EB-76FEED24A28F"
select r).FirstOrDefault();
if (uuuuuggghhh != null)
{
var ca = uuuuuggghhh.projectSummaryTxt.ToCharArray();
ViewData.Model = ca[72]; // this is the character in question
return View();
}
}
return View();
}
答案 0 :(得分:1)
@Html.Raw(((char)146).ToString())
或
@Html.Raw(String.Format("hi {0} there", (char)146))
两者似乎都有效。我在Chrome中对此进行了测试并且一直在获取空白数据,在使用FF查看后我可以确认表示是否正在打印(但是146
似乎不是可读字符)。
下面用可读字符“¶”确认:
@Html.Raw(((char)182).ToString())
不知道为什么你会想要这个。祝你好运!
答案 1 :(得分:1)
你不想使用字符146.字符146是U + 0092 PRIVATE USE TWO,一个模糊且无用的控制字符,通常呈现为不可见,或者是字形框/问号。
如果你想要角色’
:那就是U + 2019单一右侧报价标记,可以直接写入或使用’
或’
。
146是进入Windows Western代码页(cp1252)的U + 2019编码的字节数,但它不是Unicode字符编号。底部256个Unicode字符的排序与ISO-8859-1编码中的字节相同; ISO-8859-1与cp1252类似但不相同。
cp1252中的字节128-159编码各种印刷细节,如智能引号,而ISO-8859-1中的字节128-159(因此Unicode中的字符128-159)是很少使用的控制字符。对于Web应用程序,您通常希望在它们进入时过滤掉控制字符(0-31和128-159之间的其他对象),因此它们永远不会像数据库那样。
如果您从数据库中获得了预期有智能引号的字符146,那么您的数据已损坏,需要在继续之前修复它,或者您可能正在使用错误的编码读取数据库(相当这是如何工作取决于你正在谈论的数据库。)
现在这里是陷阱。如果你写:
’
作为一个字符引用,浏览器实际上显示了智能引用U + 2019 ’
,而且,令人困惑的是,不是实际拥有该代码点的无用控制字符!
这是一个旧的浏览器怪癖:€
到Ÿ
范围内的字符引用将转换为映射到cp1252中该数字的字符,而不是具有该数字的真实字符。
这可能是一个错误,但是最早的浏览器在他们正确地理解Unicode之前做了回来,并且其他所有人都被迫跟进以避免破坏页面。 HTML5现在记录并制裁这一点。 (虽然不在XHTML序列化中; XHTML解析模式下的浏览器不会这样做,因为它违反了XML的基本规则。)
答案 2 :(得分:0)
我们最终同意数据已损坏我们已经要求无法看到此字符的用户修复源数据