无法在SQL Azure for Mobile Services上存储Unicode字符

时间:2013-08-25 18:17:12

标签: sql linq azure unicode azure-mobile-services

我正在将Windows Azure移动服务与SQL Azure数据库一起用于我的Windows Phone 8应用程序。

我正在尝试存储包含Unicode字符的字符串,具体而言,表情符号如 等......

但是在SQL Azure资源管理器中,我总是看到一个带有'?'( )的simbol。我已将此Col.声明为Nvarchar(max).

要插入包含字符串字段的行,我使用的函数为:await Table.InsertAsync(Register)

数据库的整理是:SQL_Latin1_General_CP1_CI_AS

为什么我无法保存和检索这些Unicode字符?我认为使用Nvarchar时,将允许所有Unicode字符串。

感谢。

1 个答案:

答案 0 :(得分:1)

运行时中存在一个错误,它无法处理代码点0x10000之外的Unicode字符(在C#中,它们由一对Unicode代理字符表示)。那是许多表情符号所在的区域。我在PoC中遇到过这个问题,我正在研究一段时间,我通过在客户端对这些字符进行编码来解决这个问题。我现在没有代码,但我使用的代码类似于下面的代码:

public class MyType
{
    private string value;
    public string Value
    {
        get
        {
            var sb = new StringBuilder();
            for (int i = 0; i < this.value.Length; i++)
            {
                if (this.value[i] == '\\')
                {
                    if (i < this.value.Length - 1 && this.value[i + 1] == '\\')
                    {
                        sb.Append('\\');
                        i++;
                    }
                    else if (i < this.value.Length - 5 && this.value[i + 1] == 'u')
                    {
                        sb.Append((char)Convert.ToInt32(this.value.Substring(i + 2, 4), 16));
                        i += 5;
                    }
                    else
                    {
                        throw new ArgumentException("Invalid encoding");
                    }
                }
                else
                {
                    sb.Append(this.value[i]);
                }
            }

            return sb.ToString();
        }
        set
        {
            var sb = new StringBuilder();
            foreach (var c in value)
            {
                if (c == '\\')
                {
                    sb.Append("\\\\");
                }
                else if (Char.IsSurrogate(c))
                {
                    sb.AppendFormat("\\u{0:X4}", (int)c);
                }
                else
                {
                    sb.Append(c);
                }
            }

            this.value = sb.ToString();
        }
    }
}

这肯定没有最好的性能(访问属性时很多[un]转义),但在我的情况下它并没有一点瓶颈。另一个替代方案是在消息处理程序中实现转义/取消转义,这样在数据类型的正常使用中(即访问其属性)将不会感觉到这种性能(仅当通过网络时,并且可能是瓶颈,而不是转换。)