Index: /trunk/setup.cfg
===================================================================
--- /trunk/setup.cfg	(revision 32)
+++ /trunk/setup.cfg	(revision 36)
@@ -5,7 +5,7 @@
 
 # List of directories to search for 'syck.h' (separated by ':').
-include_dirs=/usr/local/include:../../include
+#include_dirs=/usr/local/include:../../include
 
 # List of directories to search for 'libsyck.a' (separated by ':').
-library_dirs=/usr/local/lib:../../lib
+#library_dirs=/usr/local/lib:../../lib
 
Index: /trunk/tests/test_unicode.py
===================================================================
--- /trunk/tests/test_unicode.py	(revision 36)
+++ /trunk/tests/test_unicode.py	(revision 36)
@@ -0,0 +1,68 @@
+# encoding: utf-8
+
+import unittest
+import syck
+
+import warnings
+
+STRINGS = [
+    ("John Cage", 'tag:yaml.org,2002:str'),
+    ("BÃ©la BartÃ³k", 'tag:python.yaml.org,2002:str'),
+    ("ÐÐ°Ð»ÐµÐœÑÐžÐœ Ð¡ÐžÐ»ÑÐ²ÐµÑÑÑÐŸÐ²", 'tag:python.yaml.org,2002:str'),
+    (''.join([chr(k) for k in range(256)]), 'tag:yaml.org,2002:binary')
+]
+
+UNICODE_STRINGS = [
+    (u"John Cage", 'tag:python.yaml.org,2002:unicode'),
+    (u"BÃ©la BartÃ³k", 'tag:yaml.org,2002:str'),
+    (u"ÐÐ°Ð»ÐµÐœÑÐžÐœ Ð¡ÐžÐ»ÑÐ²ÐµÑÑÑÐŸÐ²", 'tag:yaml.org,2002:str'),
+    (u''.join([unichr(k) for k in range(512)]), 'tag:yaml.org,2002:str')
+]
+
+DOCUMENT = """
+- John Cage
+- BÃ©la BartÃ³k
+- ÐÐ°Ð»ÐµÐœÑÐžÐœ Ð¡ÐžÐ»ÑÐ²ÐµÑÑÑÐŸÐ²
+- \x80\x81\x82\x83\x84\x85\x86\x87
+""", ["John Cage", u"BÃ©la BartÃ³k", u"ÐÐ°Ð»ÐµÐœÑÐžÐœ Ð¡ÐžÐ»ÑÐ²ÐµÑÑÑÐŸÐ²", '\x80\x81\x82\x83\x84\x85\x86\x87']
+
+
+class TestUnicode(unittest.TestCase):
+
+    def testDumpStr(self):
+        for string, tag in STRINGS:
+            #print string
+            document = syck.dump(string)
+            #print document
+            new_tag = syck.parse(document).tag
+            new_string = syck.load(document)
+            self.assertEqual(string, new_string)
+            self.assertEqual(type(string), type(new_string))
+            self.assertEqual(tag, new_tag)
+
+    def testDumpUnicode(self):
+        for string, tag in UNICODE_STRINGS:
+            #print string
+            document = syck.dump(string)
+            #print document
+            new_tag = syck.parse(document).tag
+            new_string = syck.load(document)
+            self.assertEqual(string, new_string)
+            self.assertEqual(type(string), type(new_string))
+            self.assertEqual(tag, new_tag)
+
+    def testLoad(self):
+        self._testWarning()
+        document, values = DOCUMENT
+        new_values = syck.load(document)
+        for string, new_string in zip(values, new_values):
+            self.assertEqual(string, new_string)
+            self.assertEqual(type(string), type(new_string))
+
+    def _testWarning(self):
+        warnings.simplefilter('error')
+        document = '\x80\x81\x82\x83\x84\x85\x86\x87'
+        self.assertRaises(syck.NotUnicodeInputWarning, lambda: syck.load(document))
+        warnings.resetwarnings()
+
+
Index: /trunk/tests/test_pickle.py
===================================================================
--- /trunk/tests/test_pickle.py	(revision 25)
+++ /trunk/tests/test_pickle.py	(revision 36)
@@ -348,5 +348,5 @@
         nodes = syck.parse(NODES)
         output = syck.dump(nodes)
-        print output
+        #print output
         nodes2 = syck.load(output)
         output2 = syck.emit(nodes2)
@@ -358,5 +358,5 @@
         nodes = syck.parse(BUGGY_NODES)
         output = syck.dump(nodes)
-        print output
+        #print output
         nodes2 = syck.load(output)
         output2 = syck.emit(nodes2)
Index: /trunk/tests/test_syck.py
===================================================================
--- /trunk/tests/test_syck.py	(revision 34)
+++ /trunk/tests/test_syck.py	(revision 36)
@@ -9,4 +9,5 @@
 from test_pickle import *
 from test_threads import *
+from test_unicode import *
 
 def main(module='__main__'):
Index: /trunk/lib/syck/loaders.py
===================================================================
--- /trunk/lib/syck/loaders.py	(revision 25)
+++ /trunk/lib/syck/loaders.py	(revision 36)
@@ -25,8 +25,12 @@
 import _syck
 
-import sys, re
+import sys, re, warnings
 
 __all__ = ['GenericLoader', 'Loader',
-    'parse', 'load', 'parse_documents', 'load_documents']
+    'parse', 'load', 'parse_documents', 'load_documents',
+    'NotUnicodeInputWarning']
+
+class NotUnicodeInputWarning(UserWarning):
+    pass
 
 class GenericLoader(_syck.Parser):
@@ -180,4 +184,15 @@
         return False
 
+    def construct_str(self, node):
+        try:
+            value = unicode(node.value, 'utf-8')
+        except UnicodeDecodeError:
+            warnings.warn("scalar value is not utf-8", NotUnicodeInputWarning)
+            return node.value
+        try:
+            return value.encode('ascii')
+        except UnicodeEncodeError:
+            return value
+
     def construct_numeric_base60(self, num_type, node):
         digits = [num_type(part) for part in node.value.split(':')]
Index: /trunk/lib/syck/dumpers.py
===================================================================
--- /trunk/lib/syck/dumpers.py	(revision 25)
+++ /trunk/lib/syck/dumpers.py	(revision 36)
@@ -109,5 +109,19 @@
 
     def represent_str(self, object):
-        return _syck.Scalar(str(object), tag="tag:yaml.org,2002:str")
+        try:
+            return _syck.Scalar(object.encode('ascii'), tag="tag:yaml.org,2002:str")
+        except UnicodeDecodeError:
+            try:
+                return _syck.Scalar(unicode(object, 'utf-8').encode('utf-8'),
+                        tag="tag:python.yaml.org,2002:str")
+            except UnicodeDecodeError:
+                return _syck.Scalar(object.encode('base64'),
+                        tag="tag:yaml.org,2002:binary")
+
+    def represent_unicode(self, object):
+        try:
+            return _syck.Scalar(object.encode('ascii'), tag="tag:python.yaml.org,2002:unicode")
+        except UnicodeEncodeError:
+            return _syck.Scalar(object.encode('utf-8'), tag="tag:yaml.org,2002:str")
 
     def represent_list(self, object):
@@ -139,7 +153,4 @@
     def represent_long(self, object):
         return _syck.Scalar(repr(object), tag="tag:python.yaml.org,2002:long")
-
-    def represent_unicode(self, object):
-        return _syck.Scalar(object.encode('utf-8'), tag="tag:python.yaml.org,2002:unicode")
 
     def represent_tuple(self, object):
