powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Вопрос по кодировке
15 сообщений из 15, страница 1 из 1
Вопрос по кодировке
    #33151116
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, может кто сталкивался, что на странице с кодировкой windows-1251 не выводятся символы юникода?
Подробно я обсуждаю проблему здесь:
http://www.aspnetmania.com/Forums/ForumMessage/108309.html
Max Pro
...
Рейтинг: 0 / 0
Вопрос по кодировке
    #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
Вопрос по кодировке
    #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
Вопрос по кодировке
    #33151278
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь тоже правильно показывает :)
...
Рейтинг: 0 / 0
Вопрос по кодировке
    #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
Вопрос по кодировке
    #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
Вопрос по кодировке
    #33152497
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о нет сорри, я поторопился, хотя по сути верно. щас поправлю
...
Рейтинг: 0 / 0
Вопрос по кодировке
    #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
Вопрос по кодировке
    #33155068
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greenappleЭто совсем не много на самом деле, особенно если есть рефлектор.
greenapple, а ты чем взламываешь контролы, рефлектором? Мне бы он или другой взломщик очень нужен, переписать рендер или рендер контентс я смог бы самостоятельно, только вот взломщика не хватает. Скинь, пожалуйста ссылку на то где его скачать (бесплатно). Если негде, то сбрось, пожалуйста исходники для TextBox и ListBox.
Спасибо большое!
...
Рейтинг: 0 / 0
Вопрос по кодировке
    #33155097
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.aisto.com/roeder/dotnet/
...
Рейтинг: 0 / 0
Вопрос по кодировке
    #33155476
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greenapplehttp://www.aisto.com/roeder/dotnet/
Благодарю Вас, сэр!
...
Рейтинг: 0 / 0
Вопрос по кодировке
    #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
Вопрос по кодировке
    #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
Вопрос по кодировке
    #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
Вопрос по кодировке
    #33159322
Отчего же не нужен мне представляется что в этом месте как раз нужен
если задача была не енкодить текст выводимый в атрибут value а остальное не трогать опять же можно попробовать вариант с изменением AddAttributesToRender
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Вопрос по кодировке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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