Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Вопрос по кодировке / 15 сообщений из 15, страница 1 из 1
05.07.2005, 20:02
    #33151116
Max Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
Ребята, может кто сталкивался, что на странице с кодировкой windows-1251 не выводятся символы юникода?
Подробно я обсуждаю проблему здесь:
http://www.aspnetmania.com/Forums/ForumMessage/108309.html
Max Pro
...
Рейтинг: 0 / 0
05.07.2005, 22:12
    #33151221
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
System.Text.Encoding w1251 = System.Text.Encoding.GetEncoding( 1251 );

System.IO.StreamReader sr = new System.IO.StreamReader("C:\\utfstr.txt");
string s = sr.ReadToEnd();

byte[] src = utf8.GetBytes(s);
byte[] dst = System.Text.Encoding.Convert(utf8, w1251, src);

Response.Write(s);
Response.Write(w1251.GetString(dst));

этот код выводит русский текст на страницу с windows-1251
исходный текст: текст Юникод ŞŞŒŕêÙΩ
первый Response: текст Юникод ???????
первый Response: текст Юникод SS?reU?
...
Рейтинг: 0 / 0
06.07.2005, 00:08
    #33151275
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
до меня доперло, что ты хочешь получить:) вот функция, преобразует "текст Юникод ŞŞŒŕêÙΩ"
в
"текст Юникод ŞŞŒŕêÙΩ" у меня так и показывает, как должно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private string func(string input)
{
	string str = null;

 	foreach (char c in input)
	{
		{
			str += String.Format("{0};", (int)c);
		}
	}

	return str;
}
...
Рейтинг: 0 / 0
06.07.2005, 00:09
    #33151278
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
здесь тоже правильно показывает :)
...
Рейтинг: 0 / 0
06.07.2005, 10:43
    #33151614
Max Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
greenappleдо меня доперло, что ты хочешь получить:) вот функция, преобразует "текст Юникод ŞŞŒŕêÙΩ"
в
"текст Юникод ŞŞŒŕêÙΩ" у меня так и показывает, как должно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private string func(string input)
{
	string str = null;

 	foreach (char c in input)
	{
		{
			str += String.Format("{0};", (int)c);
		}
	}

	return str;
}

Спасибо за ответ. Это мы получим вот чего:
String sStr="DE;"; - ну так например, да?
Теперь если строку респонсить или рендерить, то выведется юникод.
Да, всё верно. Но ежели строку надо вывести внутри текстбокса или листбокса то что тогда, а?
Если мы втупую запишем
TextBox1.Text="DE;", то что ты думаешь мы получим?
А мы получим DE;, а не символ юникода.
...
Рейтинг: 0 / 0
06.07.2005, 15:25
    #33152463
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
для System.Web.UI.WebControls.TextBox и пр. вэбконтрлей это невозможно сделать, т.к. внутри в RenderContents или Render вызывается HtmlEncode. Html сам по себе позволяет отображать коды символов внутри input тегов. Для того избавится от HtmlEncode нужно Render или RenderContents переписать. Это совсем не много на самом деле, особенно если есть рефлектор. Т.е. на самом деле заменить нужно будет одну строчку HttpUtility.HtmlEncode(..., writer) на writer.Write(...);

Вот как вглядит это для TextBox. Этот контрол показывает Unicode символы и ведет себя так же как обычный TextBox.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	public class MyTextBox : System.Web.UI.WebControls.TextBox
	{
		public MyTextBox() : base()
		{
			 
		}

		protected override void Render(System.Web.UI.HtmlTextWriter writer)
		{
			RenderBeginTag(writer);
			
			if (TextMode == TextBoxMode.MultiLine)
			{
				writer.Write(Text);
			}

			RenderEndTag(writer);

		}
	}

...
Рейтинг: 0 / 0
06.07.2005, 15:37
    #33152497
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
о нет сорри, я поторопился, хотя по сути верно. щас поправлю
...
Рейтинг: 0 / 0
06.07.2005, 16:33
    #33152711
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
однако просто не получится, придется попотеть.
вот так выведет то что нужно, хотя конечно тут нет такой логики, чтобы учесть все возможные аттрибуты.

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.AddAttribute("value", Text, false);
writer.AddAttribute("id", this.ClientID);
writer.AddAttribute("name", this.UniqueID);
writer.AddAttribute("type", "text");
writer.AddAttribute("class", this.CssClass);

writer.RenderBeginTag(HtmlTextWriterTag.Input);

writer.RenderEndTag();

}

<option> тоже отображает коды, так что кодировку можно в принципе не менять, если такой вариант с переделкой контролей устраивает. по другому никак, потому что HtmlControls тоже используют Write c установку флажка encode. Даже если ты подашь правильный текст, при выводе его все-равно испортит.
...
Рейтинг: 0 / 0
07.07.2005, 15:57
    #33155068
Max Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
greenappleЭто совсем не много на самом деле, особенно если есть рефлектор.
greenapple, а ты чем взламываешь контролы, рефлектором? Мне бы он или другой взломщик очень нужен, переписать рендер или рендер контентс я смог бы самостоятельно, только вот взломщика не хватает. Скинь, пожалуйста ссылку на то где его скачать (бесплатно). Если негде, то сбрось, пожалуйста исходники для TextBox и ListBox.
Спасибо большое!
...
Рейтинг: 0 / 0
07.07.2005, 16:03
    #33155097
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
http://www.aisto.com/roeder/dotnet/
...
Рейтинг: 0 / 0
07.07.2005, 17:48
    #33155476
Max Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
greenapplehttp://www.aisto.com/roeder/dotnet/
Благодарю Вас, сэр!
...
Рейтинг: 0 / 0
08.07.2005, 10:52
    #33156238
Вопрос по кодировке
greenappleоднако просто не получится, придется попотеть.
вот так выведет то что нужно, хотя конечно тут нет такой логики, чтобы учесть все возможные аттрибуты.

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.AddAttribute("value", Text, false);
writer.AddAttribute("id", this.ClientID);
writer.AddAttribute("name", this.UniqueID);
writer.AddAttribute("type", "text");
writer.AddAttribute("class", this.CssClass);

writer.RenderBeginTag(HtmlTextWriterTag.Input);

writer.RenderEndTag();

}

<option> тоже отображает коды, так что кодировку можно в принципе не менять, если такой вариант с переделкой контролей устраивает. по другому никак, потому что HtmlControls тоже используют Write c установку флажка encode. Даже если ты подашь правильный текст, при выводе его все-равно испортит.

Может быть "чтобы учесть все возможные аттрибуты" для TextBox можно попробовать переписать AddAttributesToRender а Render не трогать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
      Dim num1 As Integer
      If (Not Me.Page Is Nothing) Then
            Me.Page.VerifyRenderingInServerForm(Me)
      End If
      writer.AddAttribute(HtmlTextWriterAttribute.Name, Me.UniqueID)
      Dim mode1 As TextBoxMode = Me.TextMode
      If (mode1 = TextBoxMode.MultiLine) Then
            num1 = Me.Rows
            If (num1 >  0 ) Then
                  writer.AddAttribute(HtmlTextWriterAttribute.Rows, num1.ToString(NumberFormatInfo.InvariantInfo))
            End If
            num1 = Me.Columns
            If (num1 >  0 ) Then
                  writer.AddAttribute(HtmlTextWriterAttribute.Cols, num1.ToString(NumberFormatInfo.InvariantInfo))
            End If
            If Not Me.Wrap Then
                  writer.AddAttribute(HtmlTextWriterAttribute.Wrap, "off")
            End If
      Else
            If (mode1 = TextBoxMode.SingleLine) Then
                  writer.AddAttribute(HtmlTextWriterAttribute.Type, "text")
                  Dim text1 As String = Me.Text
                  If (text1.Length >  0 ) Then
                        'Было так
                        'writer.AddAttribute(HtmlTextWriterAttribute.Value, text1) 
                        'Пишем так
                        writer.AddAttribute(HtmlTextWriterAttribute.Value, text1, False)
                  End If
            Else
                  If (mode1 = TextBoxMode.Password) Then
                        writer.AddAttribute(HtmlTextWriterAttribute.Type, "password")
                  End If
            End If
            num1 = Me.MaxLength
            If (num1 >  0 ) Then
                  writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, num1.ToString(NumberFormatInfo.InvariantInfo))
            End If
            num1 = Me.Columns
            If (num1 >  0 ) Then
                  writer.AddAttribute(HtmlTextWriterAttribute.Size, num1.ToString(NumberFormatInfo.InvariantInfo))
            End If
      End If
      If Me.ReadOnly Then
            writer.AddAttribute(HtmlTextWriterAttribute.ReadOnly, "readonly")
      End If
      If (Me.AutoPostBack AndAlso (Not Me.Page Is Nothing)) Then
            Dim text2 As String = Me.Page.GetPostBackClientEvent(Me, "")
            If MyBase.HasAttributes Then
                  Dim text3 As String = MyBase.Attributes.Item("onchange")
                  If (Not text3 Is Nothing) Then
                        text2 = (text3 & text2)
                        MyBase.Attributes.Remove("onchange")
                  End If
            End If
            writer.AddAttribute(HtmlTextWriterAttribute.Onchange, text2)
            writer.AddAttribute("language", "javascript")
      End If
      MyBase.AddAttributesToRender(writer)
End Sub
...
Рейтинг: 0 / 0
08.07.2005, 11:00
    #33156264
Вопрос по кодировке
Ну и ещё такой вариант можно попробовать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
      Dim _Text AS String = Me.Text
      Me.Text = ""

      writer.AddAttribute(HtmlTextWriterAttribute.Value, _Text, False)

      Me.RenderBeginTag(writer)

      Me.Text = _Text

      If (Me.TextMode = TextBoxMode.MultiLine) Then
            HttpUtility.HtmlEncode(Me.Text, writer)
      End If
      Me.RenderEndTag(writer)
End Sub


...
Рейтинг: 0 / 0
08.07.2005, 19:24
    #33157682
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по кодировке
желаю знать почемуНу и ещё такой вариант можно попробовать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
      Dim _Text AS String = Me.Text
      Me.Text = ""

      writer.AddAttribute(HtmlTextWriterAttribute.Value, _Text, False)

      Me.RenderBeginTag(writer)

      Me.Text = _Text

      If (Me.TextMode = TextBoxMode.MultiLine) Then
            HttpUtility.HtmlEncode(Me.Text, writer)
      End If
      Me.RenderEndTag(writer)
End Sub




хм, там по разному. Какой-то соурс как-то смотрел, там свой набор контролей был создан просто тупо, в виде наследников от стандартных классов, и соответственно на всех страницах использовались уже они, я и подумал, что идея неплохая, если с самого начала это делать, и предвидеть такие вот ситуации.

Когда этого нет, то я не знаю что проще, кодировку поменять, или контроли переписывать, от ситуации зависит, в данном случае ситуация виднее всего Max Pro, и он решил не упрощать. Надо полагать, что дальнейшее наращивание функционала неизбежно приведет к необходимости такой же нетривиальной логики как в FCL :)

... я тут, как обычно, море ошибок допустил, поэтому твою поправлю, чтоб не плодить: Если взять твой последний вариант, то внутри If (Me.TextMode = TextBoxMode.MultiLine) Then HtmlEncode не нужен. и еще понадобится убрать вывод value для textarea, т.к. там такой аттрибут не нужен, => нужен еще один if перед RenderBeginTag.

... Мне почему-то кажется, что лучше просто добавить writer.AddAttribute(строка, ...), - короче получится в итоге, чем использовать HtmlTextWriterAttribute перечисление...
...
Рейтинг: 0 / 0
11.07.2005, 13:41
    #33159322
Вопрос по кодировке
Отчего же не нужен мне представляется что в этом месте как раз нужен
если задача была не енкодить текст выводимый в атрибут value а остальное не трогать опять же можно попробовать вариант с изменением AddAttributesToRender
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Вопрос по кодировке / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]