1

我正在为我的 Windows Phone 8 应用程序使用带有 SQL Azure 数据库的 Windows Azure 移动服务。

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

但是在 SQL Azure 资源管理器中,我总是看到一个带有“?”的符号。(�)。我已宣布此上校为Nvarchar(max).

要插入带有字符串字段的行,我正在使用函数:await Table.InsertAsync(Register).

数据库的整理是:SQL_Latin1_General_CP1_CI_AS

为什么我不能保存和检索这些 Unicode 字符?我认为使用 Nvarchar,所有 Unicode 字符串都将被允许。

谢谢。

4

1 回答 1

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]转义),但在我的情况下它不是一个瓶颈。另一种选择是在消息处理程序中实现转义/取消转义,以便在数据类型的正常使用(即访问其属性)中不会感觉到这种性能命中(仅在通过网络时,并且可能是瓶颈而不是转换)。

于 2013-08-26T05:23:39.923 回答