Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13
У меня проблема с отображением таблицы в csp, используется json + angularjs

Как можно решить эту проблему?

К сообщению приложен файл. Размер - 14Kb
4 июн 17, 16:25    [20538036]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Rishat1c,

Ну, сейчас подождите местных телепатов, они придут и все вам объяснят. Но если вдруг не придут, на всякий случай поясните, как именно "используется". Проблема тут точно не в ангуларе, клиент работает в одной кодировке, а сервер в другой. В частности, сервер скорее всего выдает юникод, а клиент почему-то работает в win-1251.
4 июн 17, 16:56    [20538061]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13
Блок А.Н.,

Делал по уроку с хабра ( линк: https://habrahabr.ru/company/intersystems/blog/204576/ )

Внимание! В спойлере содержится довольно таки 'большой' код
+
CSP файл:
<!doctype html>
<html lang="ru" ng-app>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>REST Academy</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js"></script>
<script language="javascript">
function ctrl($scope,$http) {
	// Запрос GET к REST web API
	    $scope.getCompanies=function() {
        $http.get("/rest/json/companies").success(function(data) {
	         // Помещаем ответ сервера в переменную companies
            $scope.companies=data.children; 
        }).error(function(data, status) {
	             // Вывод информации об ошибке, если таковая возникнет
            alert("["+status+"] Ошибка при загрузки компаний! ["+data+"]");
        });
    };
   
   	// Создать новую компанию
	$scope.create = function (company){ 
	   $http.post("/rest/json/company",company) 
	   .success(function(data){$scope.getCompanies();$scope.alertzone="Добавили компанию "+company.Name;}).error(function(data,status){
		$scope.alertzone="["+status+"] Ошибка добавления компании :( ["+data+"]"; });
	}  

	// Обновить существующую компанию
   $scope.update = function (company){
	   $http.put("/rest/json/company/"+company.ID,company)
		.success(function(data){$scope.alertzone="Обновили компанию "+company.Name;}).error(function(data,status){ // поменял alert(....); на alertzone
		$scope.alertzone="["+status+"] Ошибка обновления имени компании :( ["+data+"]"; });
	}    
		    
	// Удалить компанию
	$scope.delete = function (company){
		$http.delete("/rest/json/company/"+company.ID)
		.success(function(data){$scope.getCompanies();$scope.alertzone="Удалили компанию "+company.Name;}).error(function(data,status){
			$scope.alertzone="["+status+"] Ошибка удаления компании :( ["+data+"]"; });
	}      
};
</script>
</head>
<body ng-controller="ctrl" ng-init="getCompanies();">

<h4 ng-model="alertzone"><font color=red>{{alertzone}}</font></h4>

<form name="compCreateForm" ng-model="company" ng-submit="create(company); company='';">
	Добавить компанию <input type="text" ng-model="company.Name"/>
	<input type="submit" value="Добавить"/>
</form>
<br>
<div ng-repeat="company in companies">
	<form name="compForm" ng-submit="update(company); compForm.$setPristine();">
		<input type="text" ng-model="company.Name"/>
		<input type="submit" value="Сохранить" ng-show="compForm.$dirty"/>
		<input type="button" value="X" ng-click="delete(company);"/>
	</form>
</div>

</body>
</html>


Класс Brocker:
/// Брокер, Dispatch class веб-приложения
Class REST.Broker Extends %CSP.REST
{

/// Карта путей REST web API
XData UrlMap
{
<Routes>
 <Route Url="/test" Method="GET" Call="Test"/>
 <Route Url="/json/companies" Method="GET" Call="REST.JSON:GetAllCompanies"/>
 <Route Url="/json/company/:compid" Method="PUT" Call="REST.JSON:UpdateCompany"/> 
 <Route Url="/json/company/:compid" Method="DELETE" Call="REST.JSON:DeleteCompany"/> 
 <Route Url="/json/company" Method="POST" Call="REST.JSON:CreateCompany"/> 
</Routes>
}

ClassMethod Test() As %Status
{
	&html<Работает!>
	quit $$$OK
}

}



Класс JSON:
/// Класс - набор  методов, вызываемых брокером.
/// Отдают данные в формате JSON
Class REST.JSON Extends %Base
{

/// Получение списка компаний
ClassMethod GetAllCompanies() As %Status
{
	
    set st=$$$OK
    try {
	// По умолчанию возвращает первые 100 записей. Для изменения надо добавить параметр pMaxRows
    do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,"select * from Data.Company")
    } catch ex {
        set st=ex.AsStatus()
    }
    quit st
}

/// Создание нового объекта класса Data.Company
ClassMethod CreateCompany() As %Status
{
	s st=$$$OK
	try {
	// Берём JSON из запроса и конвертируем в объект класса Data.Company
	$$$THROWONERROR(st,##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,"Data.Company",.obj,1))
	// Сохраняем
	$$$THROWONERROR(st,obj.%Save())
	} 
	catch ex {
		s st=ex.AsStatus()
	}
	quit st
}

/// Удаляем объект класса Data.Company с cоответствующим id
ClassMethod DeleteCompany(compid As %String) As %Status
{
	set st=$$$OK
	try {
		$$$THROWONERROR(st,##class(Data.Company).%DeleteId(compid))
	} catch ex {
		s st=ex.AsStatus()
	}
	quit st
}

/// Изменяем объект класса Data.Company с cоответствующим id
ClassMethod UpdateCompany(compid As %String) As %Status
{
  set st=$$$OK
  try {
    
    $$$THROWONERROR(st,##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.obj,1))
    
    // Открываем объект, который хотим отредакнировать
    set comp=##class(Data.Company).%OpenId(compid)
    throw:comp=$$$NULLOREF ##class(%Exception.StatusException).CreateFromStatus($$$ERROR(5001,"Company does not exist"))

	// Редактируем и сохраняем
    set comp.Name=obj.Name
    $$$THROWONERROR(st,comp.%Save())
  } 
 catch ex {
    set st=ex.AsStatus()
  }
  quit st
}

}
4 июн 17, 18:26    [20538165]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Rishat1c,

а версия Каше какая? С юникодом или без?
w $zv
что покажет?

Для начала удалите эту строчку
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
4 июн 17, 18:39    [20538185]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Rishat1c,

или в портале "О системе" что написано в строке "Локаль NLS:"
Если rusw, то юникод.
4 июн 17, 18:45    [20538198]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13
Блок А.Н.,

w $zv
Cache for Windows (x86-64) 2017.1 (Build 792U_SU) Tue Mar 21 2017 11:38:57 EDT

К сообщению приложен файл. Размер - 30Kb
4 июн 17, 18:50    [20538212]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Rishat1c,

Да, у вас юникод, вот это
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
точно правильно работать не будет.
4 июн 17, 18:52    [20538218]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13
Блок А.Н.,

убрал строчку полностью, проблему это не решило ((

К сообщению приложен файл. Размер - 10Kb
4 июн 17, 18:56    [20538224]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Rishat1c,

Убирания строчки charset=windows-1251" браузер закрывали? А то он иногда запоминает. И это нужно убрать из всех страниц, если есть. И еще, нужно бы проверить, что записалось в таблицах, возможно, оно просто в таблицах у вас данные в неправильной кодировке.
4 июн 17, 19:04    [20538240]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13
Блок А.Н.,

да, и не только) Куки чистил, что только не делал, перезагружал.

Дело в том, что он и в Бд записывает криво. В БД хранится тоже с иероглифами (
4 июн 17, 19:38    [20538278]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13


К сообщению приложен файл. Размер - 55Kb
4 июн 17, 19:42    [20538286]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Rishat1c,

Да, вижу. Сделал приложение, у меня тоже данные приходят уже переконвертированные в UTF8.
Можно, конечно, руками перед сохранением переконвертировать обратно, но это тупо.
Сейчас подумаю, была уже такая проблема. Правда, там база была win-1251. Не думал, что это не юникодовских базах тоже происходит.
4 июн 17, 20:13    [20538326]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2340
Rishat1c
Блок А.Н.,

да, и не только) Куки чистил, что только не делал, перезагружал.

Дело в том, что он и в Бд записывает криво. В БД хранится тоже с иероглифами (
А после того как убрали кодировку 1251, пробовали новые записи добавлять?
4 июн 17, 20:34    [20538362]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
DAiMor,

Я пробовал, пока такое ощущение, что глючит.
Попробовал поиграться с параметрами CHARSET у класса Rest.Broker и у класса странички и не смог избавиться от лишней перекодировки в utf-8. раньше помогало, но rest я не использовал

Можно в метод CreateCompany добавить
s obj.Name=$zcvt(obj.Name,"I","UTF8")
Но это идиотизм
4 июн 17, 20:40    [20538373]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
DAiMor,

Я пробовал, пока такое ощущение, что глючит.
Попробовал поиграться с параметрами CHARSET у класса Rest.Broker и у класса странички и не смог избавиться от лишней перекодировки в utf-8. раньше помогало, но rest я не использовал

Можно в метод CreateCompany добавить
s obj.Name=$zcvt(obj.Name,"I","UTF8")
Но это идиотизм
4 июн 17, 20:40    [20538375]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
То есть после этого оно работает, но ставить преобразование всех полей - полнейший бред.
Но именно с rest я не работал на практике.
4 июн 17, 20:42    [20538377]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2340
Должно работать нормально, если убрать везде упоминания о кодировках, либо добавить только на страницу явно кодировку utf-8.
4 июн 17, 20:43    [20538386]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
DAiMor,

я всякие разные кодировки попробовал. Отдает все отлично в любой. На удивление даже разницы не видно.
Но упаковка объекта и отправка на сервер кривая (или прием со стороны сервера).
И я что-то думаю, что вот это вот
$http.post("/rest/json/company",company)
может лишнюю перекодировку делать. И дело не в Каше, а в ангуаре. Тем более, тут довольно старенький используется. Я бы поновее посоветовал попробовать, но у него синтаксис инициализации другой и на память я уже не помню, как его записать. У меня ночь и пару дней я не смогу в этом поразбираться.
4 июн 17, 20:54    [20538406]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2340
Кстати об AngularJS и Caché. Вот рекомендую большую серию статей на developer community.
4 июн 17, 22:01    [20538519]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Partisan M
Member

Откуда:
Сообщений: 1142
Кстати об AngularJS и Caché.
Рекомендую Cache вообще не пользоваться, а из Angular не пользоваться AngularJS или, как ещё называют, Angular 1.
Angular 2 значительно отличается от 1 и не совместимо с 1 сверху вниз. Так что, начав c Angular 1, придётся потом переучиваться. Нет никакого смысла. Сейчас уже есть версия 4 (номер 3 пропущен). Поэтому, если кого интересует Angular, то начинать изучение с версии 2 или 4. Для этого надо искать другую документацию, чем та, что на developer community. Её достаточное количество на английском языке.
5 июн 17, 09:40    [20539153]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2340
Partisan M
Рекомендую Cache вообще не пользоваться,
По AngularJS вы обосновали правильно, а по Caché нет, продолжайте, а мы послушаем.
5 июн 17, 10:06    [20539237]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12802
Partisan M
Рекомендую Cache вообще не пользоваться

Т.е. если у нас стоит Кащей и нам приспичит поангулярить - Кащей нужно выкинуть и перейти на другую СУБД?

Или объяснить руководству, что с Кащеем ангуларить противопоказано и сослаться на тебя?

На какую СУБД тогда переходить, дабы ангулярить в свое удовольствие и без опаски?
5 июн 17, 13:29    [20540003]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Partisan M,

Ангулар в целом клиентская технология, а Каше - серверная. У них прям очень тоненькое пересечение и аргументов в пользу противопоказанности этой связи я не вижу.
5 июн 17, 18:06    [20541178]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12802
Блок А.Н.
противопоказанности этой связи я не вижу.

Погоди.
У нас тут специалист объявился, сейчас он нас по этому вопросу просветит.
6 июн 17, 08:39    [20542039]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Попробовал другую версию ангулара, все то же самое.
В общем, что получается. Ангулар кодирует данные в формате UTF, все вроде бы логично.
Вы читаете поток CSP.Request.Content, он не перекодируеся. Вроде бы тоже имеет под собой основание, потому что это по сути просто входной поток данных, еще никак не обработанный.
У меня самое простой способ получения вменяемых данных такой:
/// Создание нового объекта класса Data.Company
ClassMethod CreateCompany() As %Status
{
	s st=$$$OK
	try {
		// Берём JSON из запроса и конвертируем в объект класса Data.Company
		s data= %request.Content.Read(1000000)
		$$$THROWONERROR(st,##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject($zcvt(data,"I","UTF8"),"Data.Company",.obj,1))
		// Сохраняем
		$$$THROWONERROR(st,obj.%Save())
	} 
	catch ex {
		s st=ex.AsStatus()
	}
	quit st
}

Сам лично я JSON не использовал, для меня удобнее оказалосьь использовать методы #server()#, а объекты в параметры превращать через JSON.stringify. А на форуме есть, кто JSON-ом пользуется на практике? Как делаете передачу объектов серверу?
7 июн 17, 14:50    [20547122]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Александр Коблов
Member

Откуда: Краснодар, Москва
Сообщений: 235
Rishat1c,

А CONVERTINPUTSTREAM = 1 вы не пробовали определять в REST-классе?
7 июн 17, 15:37    [20547349]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Александр Коблов
Member

Откуда: Краснодар, Москва
Сообщений: 235
Также смотрите пост на Community: Managing UTF-8 characters on the database with a REST application
7 июн 17, 15:39    [20547357]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3519
Александр Коблов,

Да, по-моему, это именно то, что нужно. Странно только, почему он по дефолту 0.
7 июн 17, 16:09    [20547531]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12802
Блок А.Н.
А на форуме есть, кто JSON-ом пользуется на практике? Как делаете передачу объектов серверу?

У нас данные в ДОС-кодировке, переводим в ВИН-кодировку и передаем...
Страница с ВИН-кодировкой нормально показывает потом полученное.
7 июн 17, 16:34    [20547640]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12802
Вот такую функцию используем для "перекодировки"

	; Преобразовать значение DOS в корректную строку json
val(Value)
	s Value=$replace(Value,$c(34),"\"_$c(34))
	s Value=$ZCVT(Value,"I","CP866")
	q Value
7 июн 17, 16:37    [20547659]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Александр Коблов
Member

Откуда: Краснодар, Москва
Сообщений: 235
Блок А.Н.,

Совместимость.
7 июн 17, 17:03    [20547823]     Ответить | Цитировать Сообщить модератору
 Re: AngularJS. Данные сохраняются в неверной кодировке  [new]
Rishat1c
Member

Откуда:
Сообщений: 13
Александр Коблов
Rishat1c,

А CONVERTINPUTSTREAM = 1 вы не пробовали определять в REST-классе?


Помогло, спасибо)
12 июн 17, 23:41    [20559071]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Caché Ответить