Jquery в windows 1251 в jquery

Время на прочтение5 мин

Количество просмотров168K

AJAX, — это технология. Одной из часто используемых техник этой технологии является
посылка запросов при помощи объекта класса XMLHttpRequest.

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

Кстати, перепечатка с моего.

И ещё, классов-то, конечно, в JavaScript нет, но для удобства будем пользоваться такой терминологией.

В документации на XMLHttpRequest сказано, что браузер должен поддерживать следующие типы
HTTP-запросов: GET, POST, HEAD, PUT, DELETE, OPTIONS.

На сегодняшний день джаваскриптом через объект класса XMLHttpRequest можно отправить
только запросы типа GET и POST.

Итак, рассмотрим 2 этих запроса:

1. Запрос типа GET:

Вся информация скрипту на сервере может передаваться только через URL и через заголовки.

Например,

GET moy-rebenok/ajax.php?f=324
Host: moy-rebenok
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127
Firefox/2.0.0.11
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/pn
g,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: moy-rebenok/ajax.html

На сервере, в ajax.php можно будет использовать конструкцию
$_GET[‘f’], чтобы получить значение переменной f.

Почему встает проблема с русскими буквами? Потому что, как вы знаете, русские буквы в URL использовать нельзя, их необходимо как-то передать при помощи доступных латинских букв, цифр и знаков, допустимых в URL после знака ‘?’.

Люди договорились, что будут делать это при помощи escape-последовательностей.

escape последовательность слова «привет» в кодировке windows-1251:
%EF%F0%E8%E2%E5%F2

escape последовательность слова «привет» в кодировке UTF-8:
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82

escape последовательность слова «привет» в кодировке KOI8-R:
%CE%CF%D5%C1%C5%D0

(Знак ‘%’, потом код символа).

Таким образом передать русские буквы можно, например, так:

GET moy-rebenok/ajax.php?f=%EF%F0%E8%E2%E5%F2
Host:…

или так:

GET moy-rebenok/ajax.php?f=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Host:…

Никто вас в этом не ограничивает.

Кстати, для GET запроса не нужно указывать заголовок Content-Type.
Т.к. никакого контента нет. Есть только запрос по определенному адресу.
Все переменные на сервер передаются через URL.

Как же смастерить необходимую escape последовательность в нужной кодировке?

Мастерить можно хоть руками, хоть как, но естественно в JavaScript.
Опять же, никто вас не ограничивает.

Но для удобства обычно используют одну из 3 функций, которые уже определены в JavaScript:

а) escape()
б) encodeURI()
в) encodeURIComponent()

По порядку:

а) escape()

Латинские буквы, цифры, символы @*/+. оставляет как есть, всё остальное кодирует так:
%xx, либо так: %uxxxx.
Причем, xxxx во втором случае, — это код символа не в UTF-8, а в Unicode

(Разница между Unicode и UTF-8).

Использовать эту функцию не надо, т.к. результат выполнения зависит от браузера, функция не является стандартизированной W3C, возникла в лихие 90-е.

К тому же, как-то нормально (по крайней мере, быстро) обработать строку в таком винигретчатом формате на сервере сложно.

Функцию escape() использует библиотека нашего соотечественника JsHttpRequest.
Не потому что библиотека плохая, а потому что создана для работы со всеми браузерами
(в том числе и с самыми древними).

б) encodeURI()

Латинские буквы, цифры, символы !@#$&*()=:/;?+’. оставляет как есть, всё остальное
кодирует
escape-последовательностями в кодировке UTF-8.

в) encodeURIComponent():

Латинские буквы, цифры, символы !*()’. оставляет как есть, всё остальное кодирует
escape-последовательностями в кодировке UTF-8.
Одобрено W3C.

Используется jQuery, prototype.js при запросе методом GET.

Возможно вы слышали от кого-то: «XMLHttpRequest работает только с UTF-8».
Теперь знаете, что это не совсем правда.

Когда используется GET-запрос, то кодировка переданных данных вообще нигде не прописывается(!).
Ещё раз повторю, ‘Content-type’, в котором мы можем указать charset
не используется в GET запросах.

Но, т.к. в JavaScript есть 2 удобные функции для перевода любой строки в строку с escape-последовательностями в UTF-8, то все их используют, и работают с UTF-8.

Именно поэтому в jQuery даже нельзя никак указать charset при отправке запроса.
Именно поэтому в Prototype.js, даже когда указываешь encoding=’windows-1251′, и используешь GET запрос, то передается всё равно UTF-8.

Просто потому что в кодах этих библиотек используется функция encodeURIComponent().

Что ж. В этом нет совершенно ничего плохого. Всё, что надо сделать, чтобы теперь работать
в PHP в
нормальной кодировке использовать iconv:

$f = iconv(‘UTF-8’, ‘windows-1251’, $_GET[‘f’]);

Кстати, мы можем это сделать именно потому, что $_GET работает так, что он понимает
escape-последовательности. Спасибо создателям PHP.

Т.е. когда приходит GET запрос PHP смотрит на URL, создает для нас массив $_GET, а мы
уже с ним
что хотим, то и делаем. Но это вроде понятно должно быть.

2) POST-запросы.

Здесь уже всё интереснее.

Вот приходит это запрос на сервер. Обработчик PHP смотрит на Content-type, и в зависимости от него заполняет массив $_POST и/или переменную $HTTP_RAW_POST_DATA.

$_POST он заполняет в том случае, когда в Content-type указано multipart/form-data или
x-www-form-urlencoded.

Что-же это за Content-type такой?
А контент-тайп это очень удобный. Он позволяет передать php скрипту несколько переменных.

Что по сути такое POST запрос?
Это заголовки, а за ними контент. Контент вообще произвольный. Т.е. просто байты, байты, байты.

Но ведь из JavaScript обычно требуется передать не просто байты, байты, байты, а несколько пар ключ=значение, ключ=значение,…
Как в GET запросе.

Вот люди и договорились о таком удобном типе, как x-www-form-urlencoded
Для того, чтобы передать f=123 и gt=null необходимо передать контент:

f=123&gt=null

Знакомо неправда ли? Конечно знакомо, и тип не зря называется x-www-form-urlencoded.
Всё то же самое, что и при GET запросе.

И как же формируется контент в библиотеках jQuery и prototype.js?

Верно, при помощи всё той же функции encodeURIComponent(), а значит и escape-последовательности будут в кодировке UTF-8. (Независимо от того, что в prototype.js вы установите encoding).

Всё. Осталась ещё одна возможность. Ведь можно передавать не x-www-form-urlencoded (т.е. не параметры), а обычный текстовый или бинарный контент, который потом можно будет прочитать через $HTTP_RAW_POST_DATA.

Для этого устанавливаем Content-type text/xml или application/octet-stream, там же устанавливаем charset=«windows-1251».

Засовываем в функцию send() строку нужной кодировки. (Prototype.js оборачивает этот вызов конструкцией new Ajax.Request(…)).

И что потом… А он (объект класса XMLHttpRequest) переводит эту строку в UTF-8, в какой бы кодировке она не была. Так написано в документации W3C. И он реально это делает.

Выводы:

1. Напрямую через XMLHttpRequest можно передавать только строки в кодировке UTF-8.

2. Можно передавать строки как бы «в любых других кодировках», если нелатинские символы
при этом за-escape-ены.

3. В JavaScript существует 3 функции, которые escape-ят нелатинские символы:
escape(), encodeURI() и encodeURIComponent().

Первая переводит в кривой Unicode. Вторые две в UTF-8.

Можно написать свои функции, которые будут генерировать escape-последовательности любой кодировки. Можно, но не нужно. Т.к. наоборот надо радоваться, что есть такие вот функции, которые переводят текст любой кодировки в UTF-8. Это черезвычайно прекрасный факт. Схема при которой все xhtml страницы работают на windows-1251, ajax с сервера клиенту кидает windows-1251, а ajax с клиента серверу кидает UTF-8 абсолютна приемлема и используется на большинстве ресурсов.

Просто не надо забывать использовать iconv как было описано ниже. А для того, чтобы сервер отдавал яваскрипту JSON (или что там у вас) в правильной кодировке (т.е. в такой же кодировке, в которой отдаются все xhtml страницы) просто в начале вашего ajax.php пропишите заголовок:

header(‘Content-type: text/html; charset=windows-1251’);

И всё будет ок.

На последок немного субъективного мнения:

Используйте jQuery, любите людей, дарите подарки.

Добрый день.

Возможно, вопрос уже обсуждался, но что-то ответа найти не могу. Не удается получить кириллицу ajax-запросом в случае использования кодировки windows-1251.
Есть 2 файла: index.html

PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
  <title>Тестовый пример</title>
  <meta http-equiv="Content-Type" content="text/html;charset=windows-1251"/>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> </script>
  <script type="text/javascript">
       $(document).ready(function(){
            $.getJSON('/test.php', function(d){
                   for (var k in d) {
                       alert('Key = ' + k + ' Value = ' + d[k]);    
                   } 
            });
       });
  </script>  
</head>
<body>
</body>
</html>

и вызываемый test.php

PHP:

<?php 
header('Content-type: text/html; charset=windows-1251');
echo json_encode(array(
    '111' => 'Текст 1',
    '222' => 'Текст 2',
));
exit;

Оба в кодировке Windows-1251. При загрузке на хостинге index.html получаю вместо текстовых строк
«Текст 1» и «Текст 2» null’ы. Как заставить выдавать нормальные строки ? Может, какие-то заголовки требуется дополнительно указать ? Если конвертирую test.php в utf-8 и указываю в header ‘…. utf-8’, всё работает нормально. Хочется просто понять, возможно ли успешно передавать данные с сервера обратно на клиента в кодировке windows-1251 ?

Заранее благодарю за помощь.

Есть форум IPB 2.3.6 с кодировкой cp1251. Надо запостить сообщение в тему.
Вот код:
(function NewPost(fid, tid, auth_key) {
    var ajaxUrl = 'http://example.com/index.php?';    
    var text = "Тестовый пост";    
    var baseData = { act: "Post", CODE: "03", f: fid, t: tid, auth_key: auth_key,
Post: text};    
    var jqxhr = jQuery.ajax({             
        type: "POST",    
        data: baseData,    
        dataType: "html",    
        contentType: 'application/x-www-form-urlencoded; charset=windows-1251',
        url: ajaxUrl    
        })
        jqxhr.done( function(data) {    
        console.log('Новое сообщение создано')   
      })
    jqxhr.fail( function(err) {
        console.log(err)
      })
}) (227, 11764579, '17cc48183ae68447d8836f40932ba4e4')

В результате на сайте выводится текст на UTF -> каракули.
Как решить проблему без изменений на сервере - форум не мой.    

Ответы

Ответ 1

Никак. AJAX-запросы передаются только в UTF-8

Ответ 2

Я так решил, когда у меня проблема подобная возникла: function sendForm(url, data, ok, error, callback) { var str = ""; var boundary = '----WebKitFormBoundary5zih7EsEnWJI1WJw'; for(var i in data) { str += '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="'+i+'"\r\n\r\n' + data[i] + '\r\n'; } var converted_str = UnicodeToWin1251(str); var send_arr = new Uint8Array(converted_str.length); for(var i = 0; i < converted_str.length; ++i) send_arr[i] = converted_str.charCodeAt(i); var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4) { if(this.status == 200) { ok(this.responseText); } else { error(this.responseText); } callback(); } }; xhttp.open("POST", url, true); xhttp.setRequestHeader('Content-Type', 'multipart/form-data; boundary='+boundary); xhttp.send(send_arr); } var DMap = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 1027: 129, 8225: 135, 1046: 198, 8222: 132, 1047: 199, 1168: 165, 1048: 200, 1113: 154, 1049: 201, 1045: 197, 1050: 202, 1028: 170, 160: 160, 1040: 192, 1051: 203, 164: 164, 166: 166, 167: 167, 169: 169, 171: 171, 172: 172, 173: 173, 174: 174, 1053: 205, 176: 176, 177: 177, 1114: 156, 181: 181, 182: 182, 183: 183, 8221: 148, 187: 187, 1029: 189, 1056: 208, 1057: 209, 1058: 210, 8364: 136, 1112: 188, 1115: 158, 1059: 211, 1060: 212, 1030: 178, 1061: 213, 1062: 214, 1063: 215, 1116: 157, 1064: 216, 1065: 217, 1031: 175, 1066: 218, 1067: 219, 1068: 220, 1069: 221, 1070: 222, 1032: 163, 8226: 149, 1071: 223, 1072: 224, 8482: 153, 1073: 225, 8240: 137, 1118: 162, 1074: 226, 1110: 179, 8230: 133, 1075: 227, 1033: 138, 1076: 228, 1077: 229, 8211: 150, 1078: 230, 1119: 159, 1079: 231, 1042: 194, 1080: 232, 1034: 140, 1025: 168, 1081: 233, 1082: 234, 8212: 151, 1083: 235, 1169: 180, 1084: 236, 1052: 204, 1085: 237, 1035: 142, 1086: 238, 1087: 239, 1088: 240, 1089: 241, 1090: 242, 1036: 141, 1041: 193, 1091: 243, 1092: 244, 8224: 134, 1093: 245, 8470: 185, 1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196, 1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155, 1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144, 8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190} function UnicodeToWin1251(s) { var L = [] for (var i=0; i


Ответ 3

Ну, вообще-то передать через AJAX cp1251 можно. Просто он не будет об этом знать. Если настроить принимающую сторону на прием cp1251 - все нормально будет. Способ я подробно описал где-то там: http://qweewqrty.blogspot.ru/2013/10/win1251-ajax.html Естественно, там нет глупых перекодировок в utf и обратно. И да, принимать по аяксу можно что угодно, не только utf. Просто укажите правильный Content-type.

Ответ 4

Может использовать xml для передачи данных?

07.11.2010, 16:03

Профессор

 

Регистрация: 31.01.2010

Сообщений: 229

jquery.post, что то с кодировкой.

jquery.post или $.post
Подскажите как сделать так чтобы данные передавались в windows-1251 кодировке???
База и сайт на windows-1251.

07.11.2010, 17:08

Профессор

 

Регистрация: 31.01.2010

Сообщений: 229

Пошарившись пол часа в инете, я нашёл способ исправить это, вроде бы работает =))
$text = iconv(«UTF-8», «cp1251», $text);
iconv(); — php функция, Преобразовывает символы строки в другую кодировку.
Надеюсь у меня всё будет норм =)))

08.11.2010, 08:13

Профессор

 

Регистрация: 10.09.2009

Сообщений: 1,582

А при отдаче сервером надо наоборот в утф-8 перекодировать. (если у тебя это происходит)

08.11.2010, 11:27

Особый гость

 

Регистрация: 02.04.2010

Сообщений: 4,260

1. iconv может быть не установлена у хостера, т.к. она вроде бы не входит в стандартный пакет
2. В Ajax по-умолчанию данные идут в UTF-8

07.06.2011, 10:38

Новичок на форуме

 

Регистрация: 19.03.2011

Сообщений: 2

а решение с iconv мультибраузерно?

если передать данные в cp1251, результат не будет кряказябрами?
$text = iconv(«UTF-8», «cp1251», $text);


Форум программистов Vingrad

Модераторы: Sardar, Aliance

Поиск:

 jquery и win-1251 

   

Опции темы

GhosTer
  Дата 14.6.2009, 05:07 (ссылка)
| (нет голосов)
 Загрузка …

Новичок

Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.5.2007

Репутация: нет
Всего: нет

Доброе утро)

Решил использовать jQuery, но столкнулся с большой бедой. Он по русски не алё!

На компе запускаю: index.html

Код

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript" src="jquery.cascade.js"></script>            
        <script type="text/javascript" src="jquery.cascade.ext.js"></script> 
        <script type="text/javascript" src="jquery.templating.js"></script> 

        <script type="text/javascript">

                            function commonTemplate(item) {
                return "<option value='" + item.Value + "'>" + item.Text + "</option>"; 
            };
            function commonTemplate2(item) {
                return "<option value='" + item.Value + "'>***" + item.Text + "***</option>"; 
            };

                        function commonMatch(selectedValue) {
                return this.When == selectedValue; 
            };

                    </script>

                <style type="text/css">
            .cascade-loading    
            {                                                                        
                background: transparent url("indicator.gif") no-repeat center;                    
            }
        </style>
    </head>
    <body>

            <h2 id="ajax_header">Simple Ajax (in ext)</h2>
    <p>Passes selected value of parent select to url as 'val=', but accepts the full ajax options hash so you can append other data as well</p>
    <div>
        <label>Parent
            <select id="simple_ajax">
                <option value="A">A</option>
                <option value="B">B</option>
                <option value="C">C</option>
                <option value="D">D</option>
            </select>
        </label>
        <label>Child
            <select id="simple_ajax_child">
            </select>
        </label>
        </label>
    </div>
    <script type="text/javascript">
        jQuery(document).ready(function()
        {    
            jQuery("#simple_ajax_child").cascade("#simple_ajax",{                        
                ajax: { 
                    url: 'data', 
                    complete: function(){ 
                        alert('my list is updated'); 
                    },
                    data: { myotherdata: jQuery("#ajax_header").html() }
                },                
                template: commonTemplate,
                match: commonMatch            
            });
        });
    </script>

        </body>
</html>

В файле data лежит:

Код

[{'When':'A','Value':'A1','Text':'попа'},{'When':'A','Value':'A2','Text':'A2'},{'When':'A','Value':'A3','Text':'A3'},
{'When':'A','Value':'A4','Text':'A4'},{'When':'B','Value':'B1','Text':'B1'},{'When':'B','Value':'B2','Text':'B2'},
{'When':'B','Value':'B3','Text':'B3'},{'When':'B','Value':'B4','Text':'B4'},{'When':'C','Value':'C1','Text':'C1'},
{'When':'C','Value':'C2','Text':'C2'},{'When':'D','Value':'D1','Text':'D1'},{'When':'D','Value':'D2','Text':'D2'}]

Все работает, но слово «попа» отображается как ����

jQuery взял тут.

Что делать?
Как его заставит писать по русски и в кодировке windows-1251?

 
youri
Дата 14.6.2009, 05:43 (ссылка)
| (нет голосов)
 Загрузка …

Опытный

Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16

это не jquery не дружит, а браузеры и ты ;)

кодировку нужно указывать не только в meta, но еще и в заголовках:
php: функция header
или
apache: SetDefaultCharset
или …

———————

С кем разговаривает Microsoft

 
GhosTer
Дата 14.6.2009, 12:09 (ссылка)
| (нет голосов)
 Загрузка …

Новичок

Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.5.2007

Репутация: нет
Всего: нет

Огромное спасибо, youri.

воткнул в data:

Код

 header('Content-Type: text/xml; charset=windows-1251');

Всё работает.

А хде про это почитать можно?

 
youri
Дата 14.6.2009, 12:50 (ссылка)
| (нет голосов)
 Загрузка …

Опытный

Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16

а почему твой json ну никак на xml не похож?

а что ты еще хочешь узнать? 
Можешь посмотреть http://www.w3.org/International/

———————

С кем разговаривает Microsoft

 
GhosTer
Дата 14.6.2009, 16:13 (ссылка)
| (нет голосов)
 Загрузка …

Новичок

Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.5.2007

Репутация: нет
Всего: нет

Цитата(youri @  14.6.2009,  12:50 )
а почему твой json ну никак на xml не похож?

Ну в примере так было. Вот я и в таком виде его и делаю)

Цитата(youri @  14.6.2009,  12:50 )
а что ты еще хочешь узнать? 

Просто ещё. Нужно знать.

СПАСИБО большое.

 
ksnk
Дата 14.6.2009, 16:53 (ссылка)
| (нет голосов)
 Загрузка …

прохожий

Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386

Цитата(youri @  14.6.2009,  12:50 )
а почему твой json ну никак на xml не похож?

Хорошая фраза  Надо послать куда-нибудь…

———————

Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! 

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Не открывается mov на windows 10
  • Windows 10 как зайти в безопасный режим при запуске компьютера
  • Как сделать принтер сетевым windows 10 через роутер
  • Windows terminal создать файл
  • Windows xp pro sp1 key