diff -urN Zope-2.7.0-b1.sample/lib/python/App/dtml/manage_page_header.dtml Zope-2.7.0-b1.editable/lib/python/App/dtml/manage_page_header.dtml
--- Zope-2.7.0-b1.sample/lib/python/App/dtml/manage_page_header.dtml	2002-12-22 20:53:57 +0300
+++ Zope-2.7.0-b1.editable/lib/python/App/dtml/manage_page_header.dtml	2003-08-16 17:40:35 +0400
@@ -1,11 +1,10 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html>
 <head>
-<dtml-unless management_page_charset>
-<dtml-call "REQUEST.set('management_page_charset','iso-8859-1')">
-</dtml-unless>
-<meta http-equiv="content-type" content="text/html;charset=&dtml-management_page_charset;">
-<dtml-call "RESPONSE.setHeader('content-type','text/html;charset='+management_page_charset)">
+<dtml-call "REQUEST.set('management_page_charset',management_page_charset_default())">
+<dtml-call "REQUEST.set('management_page_charset_tag',':'+management_page_charset_default())">
+<meta http-equiv="content-type" content="text/html;charset=<dtml-var "REQUEST['management_page_charset']">">
+<dtml-call "RESPONSE.setHeader('content-type','text/html;charset='+REQUEST['management_page_charset'])">
 <title><dtml-if title>&dtml-title;</dtml-if></title>
 <dtml-let ag="REQUEST.get('HTTP_USER_AGENT', '')"
      is_nav4="ag[:9] == 'Mozilla/4' and _.string.find(ag, 'MSIE') < 0"
diff -urN Zope-2.7.0-b1.sample/lib/python/App/Management.py Zope-2.7.0-b1.editable/lib/python/App/Management.py
--- Zope-2.7.0-b1.sample/lib/python/App/Management.py	2002-08-15 01:31:40 +0400
+++ Zope-2.7.0-b1.editable/lib/python/App/Management.py	2003-08-16 17:40:35 +0400
@@ -21,6 +21,7 @@
 from Dialogs import MessageDialog
 from Globals import DTMLFile, HTMLFile
 from AccessControl import getSecurityManager, Unauthorized
+import locale,codecs
 
 class Tabs(ExtensionClass.Base):
     """Mix-in provides management folder tab support."""
@@ -175,6 +176,30 @@
     manage_copyright=DTMLFile('dtml/copyright', globals())
     manage_copyright__roles__ = None
 
+    def management_page_charset_default(self) :
+        """ Return charset defeult or locale charset """
+        
+        charset = 'iso8859-1'
+
+        try :
+            charset = self.management_page_charset
+        except AttributeError : 
+            charset = locale.getlocale()[1]
+        else :
+            try:
+                codecs.lookup(charset)
+            except (LookupError, SystemError):
+                charset = locale.getlocale()[1]
+            else:
+                return charset
+
+        try:
+            codecs.lookup(charset)
+        except (LookupError, SystemError, TypeError):
+            return 'iso8859-1'
+        else:
+            return charset
+
     manage_zmi_logout__roles__ = None
     def manage_zmi_logout(self, REQUEST, RESPONSE):
         """Logout current user"""
diff -urN Zope-2.7.0-b1.sample/lib/python/OFS/dtml/properties.dtml Zope-2.7.0-b1.editable/lib/python/OFS/dtml/properties.dtml
--- Zope-2.7.0-b1.sample/lib/python/OFS/dtml/properties.dtml	2002-12-22 20:53:59 +0300
+++ Zope-2.7.0-b1.editable/lib/python/OFS/dtml/properties.dtml	2003-08-16 17:41:47 +0400
@@ -1,5 +1,3 @@
-<dtml-call "REQUEST.set('management_page_charset','UTF-8')">
-<dtml-var "u' '">
 <dtml-var manage_page_header>
 <dtml-with "_(management_view='Properties')">
 <dtml-var manage_tabs>
@@ -44,7 +42,7 @@
 <tr>
   <td align="left" valign="top" width="16">
   <dtml-if "'d' in _['sequence-item'].get('mode', 'awd')">
-  <input type="checkbox" name="_ids:utf8:string:list" value="&dtml-id;"
+  <input type="checkbox" name="_ids<dtml-var "REQUEST['management_page_charset_tag']">:string:list" value="&dtml-id;"
    id="cb-&dtml-id;">
   <dtml-else>
   </dtml-if>
@@ -55,7 +53,7 @@
   </div>
   </td>
   <td align="left" valign="top">
-
+ <dtml-try>
   <dtml-if "'w' in _['sequence-item'].get('mode', 'awd')">
   <dtml-if "type == 'int'">
   <input type="text" name="&dtml-id;:&dtml-type;"
@@ -64,21 +62,21 @@
   <input type="text" name="&dtml-id;:&dtml-type;" size="35"
    value="<dtml-if "hasProperty(id)"><dtml-var "('%s' % getProperty(id))" html_quote></dtml-if>">
   <dtml-elif "type in ('float', 'date')">
-  <input type="text" name="&dtml-id;:utf8:&dtml-type;" size="35"
+  <input type="text" name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:&dtml-type;" size="35"
    value="<dtml-var "getProperty(id)" html_quote>">
   <dtml-elif "type in ['string','ustring']">
-  <input type="text" name="&dtml-id;:utf8:&dtml-type;" size="35"
+  <input type="text" name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:&dtml-type;" size="35"
    value="<dtml-var "getProperty(id)" html_quote>">
   <dtml-elif "type=='boolean'">
   <input type="checkbox" name="&dtml-id;:boolean" size="35"
    <dtml-if "getProperty(id)">CHECKED</dtml-if>>
   <dtml-elif "type in ['tokens','utokens']">
-  <input type="text" name="&dtml-id;:utf8:&dtml-type;" size="35"
+  <input type="text" name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:&dtml-type;" size="35"
    value="<dtml-in "getProperty(id)">&dtml-sequence-item; </dtml-in>">
   <dtml-elif "type in ['text','utext']">
-  <textarea name="&dtml-id;:utf8:&dtml-type;" rows="6" cols="35"><dtml-var "getProperty(id)" html_quote></textarea>
+  <textarea name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:&dtml-type;" rows="6" cols="35"><dtml-var "getProperty(id)" html_quote></textarea>
   <dtml-elif "type in ['lines','ulines']">
-  <textarea name="&dtml-id;:utf8:&dtml-type;" rows="6" cols="35"><dtml-in
+  <textarea name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:&dtml-type;" rows="6" cols="35"><dtml-in
   "getProperty(id)">&dtml-sequence-item;<dtml-if
    sequence-end><dtml-else><dtml-var "'\n'"></dtml-if></dtml-in></textarea>
 
@@ -86,7 +84,7 @@
 
     <dtml-if "hasProperty(select_variable)">
     <div class="form-element">
-    <select name="&dtml-id;:utf8:text">
+    <select name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:text">
       <dtml-in "getProperty(select_variable)">
          <option
           <dtml-if "_['sequence-item']==getProperty(id)">SELECTED</dtml-if>
@@ -96,7 +94,7 @@
     </div>
     <dtml-elif "_.has_key(select_variable)">
     <div class="form-element">
-    <select name="&dtml-id;:utf8:text">
+    <select name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:text">
       <dtml-in "_[select_variable]">
          <option
           <dtml-if "_['sequence-item']==getProperty(id)">SELECTED</dtml-if>
@@ -114,7 +112,7 @@
 
     <dtml-if "hasProperty(select_variable)">
     <div class="form-element">
-    <select name="&dtml-id;:utf8:list:string" multiple
+    <select name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:list:string" multiple
       size="<dtml-var "_.min(7, _.len(getProperty(select_variable)))">">
       <dtml-in "getProperty(select_variable)">
          <option<dtml-if 
@@ -126,7 +124,7 @@
     </div>
     <dtml-elif "_.has_key(select_variable)">
     <div class="form-element">
-    <select name="&dtml-id;:utf8:list:string" multiple
+    <select name="&dtml-id;<dtml-var "REQUEST['management_page_charset_tag']">:list:string" multiple
       size="<dtml-var "_.min(7, _.len(_[select_variable]))">">
       <dtml-in "_[select_variable]">
          <option<dtml-if 
@@ -149,7 +147,10 @@
   <tr><td><dtml-var "getProperty(id)" html_quote></td></tr>
   </table>
   </dtml-if>
-  </td>
+ <dtml-except>
+  <p class="system-msg">Invalid encoding</p>
+ </dtml-try>
+ </td>
   <td align="left" valign="top">
   <div class="list-item">
   &dtml-type;
@@ -210,7 +211,7 @@
   </div>
   </td>
   <td align="left" valign="top">
-  <input type="text" name="id:utf8:string" size="30" value=""/>
+  <input type="text" name="id<dtml-var "REQUEST['management_page_charset_tag']">:string" size="30" value=""/>
   </td>
   <td align="left" valign="top" class="form-label">
   Type
@@ -244,7 +245,7 @@
   </div>
   </td>
   <td colspan=2 align="left" valign="top">
-  <input type="text" name="value:utf8:ustring" size="30" />
+  <input type="text" name="value<dtml-var "REQUEST['management_page_charset_tag']">:ustring" size="30" />
   </td>
   <td align="right" valign="top">
   <div class="form-element">
diff -urN Zope-2.7.0-b1.sample/lib/python/OFS/PropertyManager.py Zope-2.7.0-b1.editable/lib/python/OFS/PropertyManager.py
--- Zope-2.7.0-b1.sample/lib/python/OFS/PropertyManager.py	2003-06-07 19:34:50 +0400
+++ Zope-2.7.0-b1.editable/lib/python/OFS/PropertyManager.py	2003-08-16 17:40:35 +0400
@@ -16,13 +16,15 @@
 
 import ExtensionClass, Globals
 import ZDOM
+from types import TupleType,ListType
 from PropertySheets import DefaultPropertySheets, vps
 from ZPublisher.Converters import type_converters
 from Globals import DTMLFile, MessageDialog
 from Acquisition import Implicit, aq_base
 from Globals import Persistent
 from cgi import escape
-
+import locale,codecs
+from types import *
 
 
 class PropertyManager(ExtensionClass.Base, ZDOM.ElementWithAttributes):
@@ -137,7 +139,25 @@
         """Get the property 'id', returning the optional second
            argument or None if no such property is found."""
         if self.hasProperty(id):
-            return getattr(self, id)
+            value = getattr(self, id)
+
+            for p in self._properties:
+                if id==p['id'] :
+                    t = p['type']
+
+            chrs = self.management_page_charset_default()
+            if  t in ['ustring','utext','utokens','ulines'] :
+                if type(value) in [TupleType,ListType] :
+                    value = map(lambda x : x.encode(chrs),value)
+                else :
+                    value = value.encode(chrs)
+            else :
+                if type(value) in [TupleType,ListType] :
+                    value = map(lambda x : property_decode(x,chrs),value)
+                else :
+                    value = property_decode(value,chrs)
+            
+            return value
         return d
 
     def getPropertyType(self, id):
@@ -340,7 +360,14 @@
         if REQUEST is not None:
             return self.manage_propertiesForm(self, REQUEST)
 
+from types import *
+def property_decode(x,chrs) :
+    if type(x) is StringType :
+        loc_chrs = locale.getlocale()[1]
+        if loc_chrs :
+            return x.decode(loc_chrs).encode(chrs)
 
+    return x
 
 
 Globals.default__class_init__(PropertyManager)
diff -urN Zope-2.7.0-b1.sample/lib/python/ZPublisher/Converters.py Zope-2.7.0-b1.editable/lib/python/ZPublisher/Converters.py
--- Zope-2.7.0-b1.sample/lib/python/ZPublisher/Converters.py	2003-05-03 01:43:05 +0400
+++ Zope-2.7.0-b1.editable/lib/python/ZPublisher/Converters.py	2003-08-16 17:40:35 +0400
@@ -16,11 +16,20 @@
 from types import ListType, TupleType, UnicodeType
 from DateTime import DateTime
 from cgi import escape
+import locale
+import codecs
 
 def field2string(v):
-    if hasattr(v,'read'): return v.read()
-    elif isinstance(v,UnicodeType) :
-        return v.encode('latin1')
+    if hasattr(v,'read'): 
+        v = v.read()
+    if isinstance(v,UnicodeType) :
+        chrs = locale.getlocale()[1]
+        try:
+            codecs.lookup(chrs)
+        except (LookupError, SystemError, TypeError):
+            chrs = 'latin1'
+
+        return v.encode(chrs)#v.encode('latin1')
     else:
         return str(v)
 
@@ -129,6 +138,14 @@
         # rather than
         #       <input name="description:ustring" .....
         if hasattr(v,'read'): v=v.read()
+        if not isinstance(v,UnicodeType) :
+            chrs = locale.getlocale()[1]
+            try:
+                codecs.lookup(chrs)
+            except (LookupError, SystemError, TypeError):
+                chrs = 'latin1'
+            v = v.decode(chrs)#v.encode('latin1')
+            
         v = unicode(v)
         return self.convert_unicode(v)
 
diff -urN Zope-2.7.0-b1.sample/lib/python/ZPublisher/HTTPRequest.py Zope-2.7.0-b1.editable/lib/python/ZPublisher/HTTPRequest.py
--- Zope-2.7.0-b1.sample/lib/python/ZPublisher/HTTPRequest.py	2003-07-21 20:37:22 +0400
+++ Zope-2.7.0-b1.editable/lib/python/ZPublisher/HTTPRequest.py	2003-08-16 17:40:35 +0400
@@ -24,6 +24,7 @@
 from TaintedString import TaintedString
 from maybe_lock import allocate_lock
 xmlrpc=None # Placeholder for module that we'll import if we have to.
+import locale
 
 isCGI_NAME = {
         'SERVER_SOFTWARE' : 1,
@@ -522,7 +523,12 @@
                                 if hasattr(converter,'convert_unicode'):
                                     item = converter.convert_unicode(item)
                                 else:
-                                    item = converter(item.encode('latin1'))
+                                    chrs = locale.getlocale()[1]
+                                    if not has_codec(chrs) :
+                                        chrs = 'latin1'
+
+                                    item = converter(item.encode(chrs)) #item.encode('latin1'))
+
                             else:
                                 item=converter(item)
 
@@ -1361,7 +1367,7 @@
 def has_codec(x):
     try:
         codecs.lookup(x)
-    except (LookupError, SystemError):
+    except (LookupError, SystemError, TypeError):
         return 0
     else:
         return 1
