I've examined the sources of prado and javascript stuff for the last few hours. This seems to me possible.
First, prado output for callbacks:
There are 5 json encoded data fields and 1 html content field (not json encoded). As follows:
const CALLBACK_DATA_HEADER = 'X-PRADO-DATA';
const CALLBACK_ACTION_HEADER = 'X-PRADO-ACTIONS';
const CALLBACK_ERROR_HEADER = 'X-PRADO-ERROR';
const CALLBACK_PAGESTATE_HEADER = 'X-PRADO-PAGESTATE';
const CALLBACK_REDIRECT = 'X-PRADO-REDIRECT';
[i]These are from framework/Web/UI/ActiveControls/TActivePageAdapter.php[/i]
CALLBACK_ERROR_HEADER is sent using HTTP HEADER, this is line 320 from TActivePageAdapter.php
$response->appendHeader(TActivePageAdapter::CALLBACK_ERROR_HEADER.': '.$trace);
All other headers are sent using the HTTP content body.
Prado divides the HTTP content body into subfields, called "content part"s. Each part is of the form
<!--DelimiterString-->Part's content<!--DelimiterString-->
Delimiter strings are unique for each content part, and they are different among other content part delimiters.
Normally, nearly every content part holds some HTML fragment to be replaced on the page. The association between delimiter strings and the associated controls' client-side identifiers are passed in the CALLBACK_xxxx_HEADER values.
These CALLBACK_xxxx_HEADER values are also passed as part contents (except for CALLBAC_ERROR_HEADER, that's passed thru http header). Their delimiter strings are the 'X-PRADO-xxxx' strings.
This is some example on how a callback reply might be:
HTTP/1.1 200 OK
Content-Type: [i don't know this, but probably text/html. It is possible to put a charset=something here, using Globalization.charset]
X-PRADO-ERROR: //json encoded utf8 string//
<!--X-PRADO-DATA-->//json encoded utf8 string//<!--X-PRADO-DATA-->
<!--X-PRADO-PAGESTATE-->//json encoded utf8 string//<!--X-PRADO-PAGESTATE-->
<!--X-PRADO-ACTIONS-->//another json encoded utf8 string//<!--X-PRADO-ACTIONS-->
<!--vergverg-->//some control's html content//<!--vergverg-->
<!--cnfy834-->//another control's html content//<!--cnfy834-->
(I've put the line ends myself for readability, the only separator is the comment-looking delimiter strings)
Now, the problem.
1. Browser doesn't find a html head inside the content body, thus, is unable to guess the correct encoding if globalization.charset is not used. Browser thinks this is UTF-8 (in fact it may guess anything, maybe local computer's charset)
2. Controls' html contents are sent using their own encoding, when the application is not UTF-8, this means there is wrong content in the html. Browser thinks this is utf-8, so renders it wrong
3. The problem seems to be solvable with just sending a correct charset= parameter, this will fix the problem for html updates. But we have a another problem, the contents of X-PRADO-xxxx fields. These (probably?) contain information like, the contents of a textbox. These 'data' is not given as html but as data to be parsed by javascript (I guess only tactivepanel is sent as html in practice). If i set a non UTF-8 text to an active control, my head will probably ache

4. A note on "json encoded utf8 string": although json.org says any utf8 character may be passed as is, but may also be encoded in a form like \uXXXX, the implementation prado uses always encodes non-ASCII characters as \uXXXX. This makes the "json encoded utf8 string"s valid for any US-ASCII compatible charset, i mean, whatever charset= is given in the HTTP header.
Enough reverse engineering, now what i think may be feasible is something like:
The json encoding is done only for these PRADO_HEADER_xxxx fields, in TActivePageAdapter.php. It is possible to change encoding from "application's encoding" to utf8 just before TJavascript::jsonEncode is called in this page.
For the "content part"s, no charset conversion is necessary, as long as the charset is specified in http header. Specifying a US-ASCII compatible charset will not break the json-encoded values either, as JSON will encode any character that is not in range 0..127 to some characters in that range.
This is for sending. For receiving data from active controls, we will still have encoding problems, i didn't examined those, but i think it sends data as JSON-encoded too. As javascript is the one that created the data, strings in it are UTF8. After the JSON-decoding, if these strings are converted to application's encoding, well, it seems to me that everything will work perfectly in AJAX for non UTF8 charsets

BTW, Prado rocks

with only a change of 1-2 lines in 5-6 places, all of the above is possible

-kerem