воскресенье, мая 15, 2011

Sharepoint 2010 и русские имена столбов списков

Если вы сталкивались с написанием CAML запросов для Sharepoint 2010 то знаете, что обращение к столбцам с русскими именами достаточно затруднительно т.к. если столбец создавался изначально с русским именем то его внутреннее имя будте представленно закодированным значением. Например если вы назвали свой столбец "Столбец" то его внутренним именем будет : _x0421__x0442__x043e__x043b__x0431__x0435__x0446_.
Я часто сталкиваюсь с такой белибердой и выяснил что это на самом деле HEX значение Unicode символов окруженные и _ . Вооружившись этим знанием я написал две функции для преобразования строки туда и обратно:

public static class NameConverter
    {
        /// <summary>
        /// Расшифровать имя из внутреннего представления
        /// </summary>
        /// <param name="val">Закодированое имя</param>
        /// <returns>Расшифрованое значение</returns>
        public static string DecodeName(string val)
        {
            val = val.Replace("ows", "");
            if (!val.Contains("_x")) return val;

            var sb = new StringBuilder();
            val = val.Replace("_", "");
            var parts = val.Split(new[] { 'x' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string part in parts)
            {
                int v = int.Parse(part, NumberStyles.HexNumber);
                var c = (char)v;
                sb.Append(c);
            }
            return sb.ToString();
        }
        /// <summary>
        /// Закодировать русскую строку
        /// </summary>
        /// <param name="name">Имя для кодирования</param>
        /// <returns>Закодированое значение</returns>
        public static string EncodeName(string name)
        {
            var sb = new StringBuilder();
            for (int i = 0; i < name.Length; i++)
            {
                sb.AppendFormat("_x{0:x4}_", (int)name[i]);
            }
            return sb.ToString();
        }
    }