diff --git a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
index defbc7ae89..664e58aa87 100644
--- a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
+++ b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
@@ -298,6 +298,10 @@ class XmlDumper extends Dumper
$element->setAttribute('type', 'expression');
$text = $this->document->createTextNode(self::phpToXml((string) $value));
$element->appendChild($text);
+ } elseif (\is_string($value) && !preg_match('/^[^\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]*+$/u', $value)) {
+ $element->setAttribute('type', 'binary');
+ $text = $this->document->createTextNode(self::phpToXml(base64_encode($value)));
+ $element->appendChild($text);
} else {
if (in_array($value, array('null', 'true', 'false'), true)) {
$element->setAttribute('type', 'string');
diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
index 71ddd2227b..7c89984cef 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
@@ -511,6 +511,12 @@ class XmlFileLoader extends FileLoader
}
$arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag'));
break;
+ case 'binary':
+ if (false === $value = base64_decode($arg->nodeValue)) {
+ throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="binary" is not a valid base64 encoded string.', $name));
+ }
+ $arguments[$key] = $value;
+ break;
case 'string':
$arguments[$key] = $arg->nodeValue;
break;
diff --git a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
index 99ac00567d..60a01bd666 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
+++ b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
@@ -246,6 +246,7 @@
+
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php
index 1a4e5ab5c8..31e6baab32 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php
@@ -9,6 +9,8 @@ $container = new ContainerBuilder(new ParameterBag(array(
'bar' => 'foo is %%foo bar',
'escape' => '@escapeme',
'values' => array(true, false, null, 0, 1000.3, 'true', 'false', 'null'),
+ 'binary' => "\xf0\xf0\xf0\xf0",
+ 'binary-control-char' => "This is a Bell char \x07",
)));
return $container;
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php
index dc7da1c274..eeeb37a072 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php
@@ -135,6 +135,8 @@ class ProjectServiceContainer extends Container
6 => 'false',
7 => 'null',
),
+ 'binary' => 'ננננ',
+ 'binary-control-char' => 'This is a Bell char ',
);
}
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml
index bc1186bd93..5bd9d1127b 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml
@@ -18,6 +18,8 @@
false
null
+ 8PDw8A==
+ VGhpcyBpcyBhIEJlbGwgY2hhciAH
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml
index 4e37bc9315..a17a71cc8e 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml
@@ -4,6 +4,8 @@ parameters:
bar: 'foo is %%foo bar'
escape: '@@escapeme'
values: [true, false, null, 0, 1000.3, 'true', 'false', 'null']
+ binary: !!binary 8PDw8A==
+ binary-control-char: !!binary VGhpcyBpcyBhIEJlbGwgY2hhciAH
services:
service_container: